Ios 在UITableViewCell内调用UIAlertController
调用函数时,我试图从我的Ios 在UITableViewCell内调用UIAlertController,ios,swift,uitableview,uialertcontroller,Ios,Swift,Uitableview,Uialertcontroller,调用函数时,我试图从我的uitableviewcell中调用UIAlertController。它给我一个错误,说现在不可用。我知道它不在ViewController中。我正在寻找一种方法来访问它 override func awakeFromNib() { super.awakeFromNib() // Initialization code let tapGestureShareImageView = UITapGestureRecognizer(target: s
uitableviewcell
中调用UIAlertController
。它给我一个错误,说现在不可用。我知道它不在ViewController
中。我正在寻找一种方法来访问它
override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
let tapGestureShareImageView = UITapGestureRecognizer(target: self, action: #selector(self.shareImageTouchUpInside))
shareImageView.addGestureRecognizer(tapGestureShareImageView)
shareImageView.isUserInteractionEnabled = true
}
@objc func shareImageTouchUpInside() {
showAction()
}
func showAction() {
let alertController = UIAlertController(title: "Action Sheet", message: "What do you like to do", preferredStyle: .alert)
let okButton = UIAlertAction(title: "Done", style: .default, handler: { (action) -> Void in
print("Ok button tapped")
})
let deleteButton = UIAlertAction(title: "Skip", style: .destructive, handler: { (action) -> Void in
print("Delete button tapped")
})
alertController.addAction(okButton)
alertController.addAction(deleteButton)
present(alertController, animated: true, completion: nil)
}
“显示”仅对ViewController可用。您必须将触摸事件重定向到视图控制器。最常见的方法是在UITableViewCell中使用委托属性
当前仅对ViewController可用。您必须将触摸事件重定向到视图控制器。最常见的方法是在UITableViewCell中使用委托属性
您可以尝试使用委托
protocol AlertShower{
func showAlert(TableCustomCell)
}
class TableCustomCell: UITableViewCell {
var delegate: AlertShower?
@IBAction func showClicked(_ sender: UIButton) {
self.delegate?.alertShower(sender:self)
}
}
在VC中
class viewController: UIViewController, AlertShower {
override func viewDidLoad() {
super.viewDidLoad()
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = areaSettTable.dequeueReusableCell(withIdentifier:CellIdentifier1) as! TableCustomCell
cell.delegate = self
return cell
}
func showAlert(sender:TableCustomCell) {
// show alert here
}
}
您可以尝试使用委托
protocol AlertShower{
func showAlert(TableCustomCell)
}
class TableCustomCell: UITableViewCell {
var delegate: AlertShower?
@IBAction func showClicked(_ sender: UIButton) {
self.delegate?.alertShower(sender:self)
}
}
在VC中
class viewController: UIViewController, AlertShower {
override func viewDidLoad() {
super.viewDidLoad()
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = areaSettTable.dequeueReusableCell(withIdentifier:CellIdentifier1) as! TableCustomCell
cell.delegate = self
return cell
}
func showAlert(sender:TableCustomCell) {
// show alert here
}
}
从子类
UIView
创建自定义活动指示器时,我自己也遇到了类似的问题。我所做的是创建“show”函数(在子类中)并传入UIViewController
参数,如下所示:
public func play(inView view: UIViewController) {
//Perform action here
view.present(alertController, animated: true, completion: nil)
}
只需在视图控制器中调用它,如下所示:
CustomClass.play(inView: self)
希望这有帮助 从子类
UIView
创建自定义活动指示器时,我自己也遇到了类似的问题。我所做的是创建“show”函数(在子类中)并传入UIViewController
参数,如下所示:
public func play(inView view: UIViewController) {
//Perform action here
view.present(alertController, animated: true, completion: nil)
}
只需在视图控制器中调用它,如下所示:
CustomClass.play(inView: self)
希望这有帮助 一,。协议名称(如类名)应以大写字母开头。2.将单元格作为参数传递给委托方法会很有用。然后,代理知道哪个显示触发了请求,并可能使用该信息从其数据模型中获取数据。是的,我将在其中传递postID。我只是在访问UIAlertControllerBy时变为空白,使用回调,例如
var onShare:(()->Void)?
可能是一个更好的主意,因为它允许更好的代码组织。@Sulthan您的var onShare:(()->Void)解决方案是什么样子的?
看起来如何?我想在加载单元格内容失败时显示警报,但我不确定你的意思。1。协议名称(如类名)应以大写字母开头。2.将单元格作为参数传递给委托方法会很有用。然后,代理知道哪个显示触发了请求,并可能使用该信息从其数据模型中获取数据。是的,我将在其中传递postID。我只是在访问UIAlertControllerBy时变为空白,使用回调,例如var onShare:(()->Void)?
可能是一个更好的主意,因为它允许更好的代码组织。@Sulthan您的var onShare:(()->Void)解决方案是什么样子的?
看起来如何?我想在加载单元格内容失败时显示警报,但我不确定你的意思。这是解决此问题的一种非常糟糕的方法。演示是UIViewController的责任,而不是子视图的责任。在子视图中将ViewController作为参数传递的最大问题是,它可能会创建循环依赖项,导致内存泄漏,这很难调试。委派模式虽然更麻烦,但更加安全,并且是iOS环境的固有模式(尽管我个人会使用反应式框架)。嗯……感谢您提供的信息/见解。我还没有看到任何内存泄漏,但我肯定会重新做我的分析,按照建议的委派模式进行。谢谢一般来说,从责任的角度考虑是好的,即谁对什么负责。UIViewControllers负责某些事情,UIViews负责其他事情等。如果职责重叠,请尝试在代码中创建定义良好的限制(根据每个类负责的内容),这是解决此问题的非常糟糕的方法。演示是UIViewController的责任,而不是子视图的责任。在子视图中将ViewController作为参数传递的最大问题是,它可能会创建循环依赖项,导致内存泄漏,这很难调试。委派模式虽然更麻烦,但更加安全,并且是iOS环境的固有模式(尽管我个人会使用反应式框架)。嗯……感谢您提供的信息/见解。我还没有看到任何内存泄漏,但我肯定会重新做我的分析,按照建议的委派模式进行。谢谢一般来说,从责任的角度考虑是好的,即谁对什么负责。UIViewController负责某些事情,UIViews负责其他事情等。如果职责重叠,请尝试在代码中创建定义良好的限制(根据每个类负责的内容),理想情况下,不要从单元格中显示视图控制器。相反,创建一个委托或回调函数,并将事件传递给视图控制器,然后从那里显示警报。理想情况下,不要从单元格中显示视图控制器。相反,创建一个委托或回调函数,并将事件传递给视图控制器,然后从那里显示警报。