swift - 我试图从 VC 中的另一个 View 禁用 tableview 上的 userInteraction,但它不会让我调用该函数

标签 swift uitableview model-view-controller uiviewcontroller

我正在尝试遵循 MVC,它在自己的文件中包含 View 的所有逻辑,而不是 View Controller 。我现在想做的是在你点击照片时放大照片,然后禁用与它现在前面的 tableview 的交互(点击放大的图像只是点击它下面的 tableview ...)。

这是我尝试过的:

class TripsVC: UIViewController, UITableViewDelegate, UITableViewDataSource {

@IBOutlet weak var tableView: UITableView!

static var imageCache:NSCache<NSString, NSData> = NSCache()

func disable() {
    tableView.isUserInteractionEnabled = false
}
}

然后

类 profileView:ShadowedView {

@IBOutlet var profilePictureView:UIImageView!

var aviFullscreen = false
var initalAviRect:CGRect!

override func awakeFromNib() {
    super.awakeFromNib()

    initalAviRect = profilePictureView.frame

    let tap = UITapGestureRecognizer(target: self, action: #selector(self.showPhoto(_sender:)))
    tap.numberOfTapsRequired = 1

    profilePictureView.addGestureRecognizer(tap)
}


func showPhoto(_sender: UITapGestureRecognizer) {
    superview?.bringSubview(toFront: profilePictureView)
    switch aviFullscreen {
    case false:
        aviFullscreen = true
        TripsVC.disable() //Issue Here -----------------------
        UIView.animate(withDuration: 0.3, delay: 0, options: .curveEaseInOut, animations: { [weak self] in
            self?.profilePictureView.frame = CGRect(x: (self?.superview?.frame.width)! * 0.125, y: 140, width: (self?.superview?.frame.width)! * 0.75, height: (self?.superview?.frame.width)! * 0.75)
            }, completion: nil)
    default:
        aviFullscreen = false
        TripsVC.enable() // Issue here---------------------
        UIView.animate(withDuration: 0.3, delay: 0, options: .curveEaseInOut, animations: { [weak self] in
            self?.profilePictureView.frame = (self?.initalAviRect)!
            }, completion: nil)
    }

}

}

当我尝试在我的 profileView 中调用启用/禁用功能时,它不会让我这样做。它给出了错误:

“实例成员“disable”不能用于类型“TripsVC””

我该如何实现?

最佳答案

您不是在 TripsVC 实例上调用这些方法,而是试图直接在类型上调用它(这不会起作用)。

您需要添加一种方法来访问您要启用/禁用的 VC 对象。

正常的做法是:

  1. 定义一个带有禁用/启用函数的协议(protocol)
  2. 给这个协议(protocol)类型的类添加一个var
  3. 在VC中实现协议(protocol)
  4. 将此类的协议(protocol)变量设置为VC
  5. 通过该变量调用启用/禁用

所以,

1:

protocol Enableable {
    func enable()
    func disable()
}

2:

var outerGUI: Enableable? = nil

3:

class TripsVC: UIViewController, Enableable // and whatever else you need

4:在TripsVC某处

 yourView.outerGUI = self

5: 在你展示的类里面

 outerGUI?.enable() // or disable

您经常看到这称为委托(delegate)模式或类似的东西。

关于swift - 我试图从 VC 中的另一个 View 禁用 tableview 上的 userInteraction,但它不会让我调用该函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44267029/

相关文章:

ios - Objective-C : Turning off music after switching views

css - table.data 指的是什么?

ios - UITableView 背景颜色在 iPad 上总是白色

ios - UItableViewCell 重复

swift - 如何在 swift 3 中使用 Alamofire->4.0 映射对象

swift - 让声音正常工作

ios - 如何将 UITableView 设置为捕捉到最近的单元格?

model-view-controller - 在领域驱动设计中,你能在你的 UI 中使用你的领域实体吗?

iOS Xcode 8.3 Facebook SDK 登录错误

swift - ARKit——适应光照条件