Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/97.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 在UITableViewCell内调用UIAlertController_Ios_Swift_Uitableview_Uialertcontroller - Fatal编程技术网

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负责其他事情等。如果职责重叠,请尝试在代码中创建定义良好的限制(根据每个类负责的内容),理想情况下,不要从单元格中显示视图控制器。相反,创建一个委托或回调函数,并将事件传递给视图控制器,然后从那里显示警报。理想情况下,不要从单元格中显示视图控制器。相反,创建一个委托或回调函数,并将事件传递给视图控制器,然后从那里显示警报。