tableView 设置编辑 menuController Action 不起作用

Posted

技术标签:

【中文标题】tableView 设置编辑 menuController Action 不起作用【英文标题】:tableView set editing of menuController Action not working 【发布时间】:2017-06-16 03:57:26 【问题描述】:

我有一个 tableView 和 tableViewCell。我创建了 MenuController 来进行 setTableView 编辑。但似乎失败了。但我使用导航按钮添加“testFunc”的操作。它可以改变多选编辑。我想念什么?我已经添加了 tableView 的子视图。而且我也跟着UITableViewDataSource,UITableViewDelegate。

protocol DelegateA 
func testFunc()


class ViewController: UIViewController,DelegateA  

lazy var tableView:UITableView =  ()->UITableView in
    let ui:UITableView = UITableView()
    ui.delegate = self
    ui.dataSource = self
    ui.separatorStyle = .none
    ui.backgroundColor = defaultBackgroundColor
    return ui
()

override func viewDidLoad() 
    super.viewDidLoad()

    self.tableView.allowsMultipleSelectionDuringEditing = true


func testFunc() 

    print("123") //it print "123" successful

    //not working
    if(self.tableView.isEditing == false) 
        self.tableView.setEditing(true, animated:true)
    
    else 
        self.tableView.setEditing(false, animated:true)
    



这是自定义tableViewCell的标签

class UITalkContent:UILabel 

var delegate:DelegateA?

override init(frame: CGRect) 
    super.init(frame:frame)
    translatesAutoresizingMaskIntoConstraints = false
    numberOfLines = 0
    isUserInteractionEnabled = true
    addGestureRecognizer(UILongPressGestureRecognizer(target: self, action: #selector(gestureLongPress)))


required init?(coder aDecoder: NSCoder) 
    fatalError("init(coder:) has not been implemented")


override func drawText(in rect: CGRect) 
    let insets: UIEdgeInsets = UIEdgeInsets(top: defaultContentPadding, left: defaultPadding, bottom: defaultContentPadding, right: defaultPadding)
    super.drawText(in: UIEdgeInsetsInsetRect(rect, insets))


func gestureLongPress(sender:UILongPressGestureRecognizer) 

    if (sender.state == .ended) 
        return
    

    becomeFirstResponder()


    let menu = UIMenuController.shared


    menu.menuItems = [
        UIMenuItem(title: localString(string: "FORWARD"), action: #selector(forward)),
    ]


    menu.setTargetRect(bounds, in: self)


    menu.setMenuVisible(true, animated: true)


func forward(menu :UIMenuController ) 
    print("321") //print "321" successfully 
    self.delegate = ViewController()
    self.delegate?.testFunc()



override var canBecomeFirstResponder: Bool
    return true


override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool 
    if (action == #selector(UIResponderStandardEditActions.copy(_:)) || action == #selector(forward)) 
        return true
    
    return false


override func copy(_ sender: Any?) 
    UIPasteboard.general.string = text


2017.06.16 更新

class ContentTableViewCell: UITableViewCell 

var labelContent:UILabel =  ()->UILabel in
    let ui:UILabel = UITalkContent()
    ui.textColor = UIColor(red:0.20, green:0.20, blue:0.20, alpha:1.00)
    ui.backgroundColor = UIColor.white
    ui.font = defaultTextFont
    ui.numberOfLines = 0
    ui.lineBreakMode = NSLineBreakMode.byCharWrapping
    ui.layer.cornerRadius = defaultButtonRadius
    ui.layer.masksToBounds = true
    ui.isHidden = false
    return ui
()

    override init(style: UITableViewCellStyle, reuseIdentifier: String?) 
    super.init(style: style, reuseIdentifier: reuseIdentifier)
    loadContent()


required init?(coder aDecoder: NSCoder) 
    super.init(coder: aDecoder)


override func layoutSubviews() 
    super.layoutSubviews()
    loadVFL()


func loadContent() 
    contentView.addSubview(labelContent)


func loadVFL() 
    labelContent.frame = CGRect(x: 0, y: 0, width: contentWidth, height: CGFloat.greatestFiniteMagnitude)
    labelContent.sizeToFit() 



【问题讨论】:

【参考方案1】:

您想知道的实际上是不清楚和模糊的。但我可以在这里看到 你以错误的方式做 protocol-delegation。为了使这个过程正确,请按照以下步骤操作:

    在您的发件人类中创建一个协议,您希望从中传递任何消息(在您的情况下:UITalkContent

    protocol MyProtocol 
        func testFunc()
    
    class UITalkContent: UILabel ...
    

    在您的发件人类中添加delegate var

    class UITalkContent: UILabel 
        var delegate: MyProtocol?
        ...
        ...
    
    

    使用此delegate var 调用您在协议中指定的方法。这必须在您的发件人类中以及在您准备发送任何消息时完成。在您的情况下,它是func forward(menu:)

    class UITalkContent: UILabel 
        ...
        ...
        func forward(menu :UIMenuController ) 
            ...
            ...
            delegate.testFunc()
        
        ...
        ...
    
    

    在您的接收类中采用协议(在您的情况下:ViewController

    class ViewController: UIViewController, MyProtocol 
        ...
        ...
    
    

    在接收类中实现协议的方法。当通知发生时,程序控制将转移到这里。

    class ViewController: UIViewController, MyProtocol 
        ...
        ...
        func testFunc() 
            // do what you want to do when program control reaches here
        
        ...
        ...
    
    

    现在您必须将接收类设置为该发送者类的delegate。为此,您必须将self(接收类)分配给发送者类的实例。 (但我没有看到您的 UILabel 的任何实例)

    class ViewController: UIViewController, MyProtocol 
        ...
        ...
        `instance of UILabel` = self
        ...
        ...
    
    

【讨论】:

你好,@nayem 我的 UITalkContent 实例写在 TableViewCell 中。我应该怎么做第 6 步?我还更新了关于 tableviewCell 的问题。 好的。你有一个非常复杂的实现。你实际上想达到什么目的? 你的标签是否应该通知你的 ViewController 一些事情? 我也觉得很复杂。我将 GestureRecognizer 添加到标签,然后显示 menuController。单击菜单动作让 TableView Mutiselected。我更新图像。

以上是关于tableView 设置编辑 menuController Action 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

JavaFx表格视图TableView设置单元格可编辑

在 iPad 上编辑时编辑 tableview 缺少背景颜色

编辑时的 TableView 单元格背景不起作用

重新加载表格后 UITableView 编辑设置为 NO

退出编辑模式

为 TableView 单个单元格设置禁用属性