我正在尝试遵循 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 对象。
正常的做法是:
- 定义一个带有禁用/启用函数的协议(protocol)
- 给这个协议(protocol)类型的类添加一个var
- 在VC中实现协议(protocol)
- 将此类的协议(protocol)变量设置为VC
- 通过该变量调用启用/禁用
所以,
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/