注册 登录
主题 : objc 中 id<delegate>这个类型在swift中怎么写?
级别: 侠客
UID: 4260
精华: 0
发帖: 122
可可豆: 800 CB
威望: 800 点
在线时间: 295(时)
注册时间: 2009-04-08
最后登录: 2017-09-22
0 楼:  发表于: 2015-01-26 20:47    发自: Web Page

objc 中 id<delegate>这个类型在swift中怎么写?   

我是想传递一个类并实现了某几个delegate的类型的参数,但在swift中用 AnyObject<xxx,xxx> 或 uiviewcontroller<xx,xxx>都编译出错,要怎么写?问题在与我要用这个参数高用delegate中的方法和类的方法
级别: 侠客

状态: 连续签到 - [637天]
UID: 265261
精华: 0
发帖: 61
可可豆: 3313 CB
威望: 2004 点
在线时间: 513(时)
注册时间: 2013-10-11
最后登录: 2017-09-22
1 楼:  发表于: 2015-01-26 23:22    发自: Web Page
以下是完整的代理使用代码,希望对你有用


//协议
protocol LAMDelegate: NSObjectProtocol {
    func myFunc()
}

class CView: UIView{
    
    var delegate:LAMDelegate!
    var btn:UIButton!
    
    override init(frame: CGRect) {
        super.init(frame:frame)
        
        self.backgroundColor = UIColor.redColor()
        
        btn = UIButton.buttonWithType(UIButtonType.System) as UIButton
        btn.backgroundColor = UIColor.redColor()
        btn.addTarget(self, action:"click:", forControlEvents: UIControlEvents.TouchUpInside)
        btn.frame = self.bounds
        self.addSubview(btn);
        
    }
    
    func click(button: UIButton){
        
        if self.delegate != nil && self.delegate.respondsToSelector("myFunc"){
            self.delegate.myFunc()
        }
    }

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

}

class ViewController: UIViewController,LAMDelegate {
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let cv = CView(frame: CGRectMake(200, 200, 40, 30))
        cv.delegate = self
        self.view.addSubview(cv)
    }

    //TODO: 实现代理方法
    func myFunc() {
        println("写入你的代码")
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

}

级别: 侠客
UID: 4260
精华: 0
发帖: 122
可可豆: 800 CB
威望: 800 点
在线时间: 295(时)
注册时间: 2009-04-08
最后登录: 2017-09-22
2 楼:  发表于: 2015-01-27 10:56    发自: Web Page
感谢您的回复,不过您误解我的意思。
myFunc(pram:id<XXDelegate>)
{
     param.fun1();// XXDelegate中的方法
     param.xxx //id类中的方法
}
级别: 新手上路
状态: 连续签到 - [2天]
UID: 325552
精华: 0
发帖: 58
可可豆: 132 CB
威望: 99 点
在线时间: 509(时)
注册时间: 2014-06-12
最后登录: 2016-01-31
3 楼:  发表于: 2015-01-27 11:28    发自: Web Page
protocol MenuTableViewControllerDelegate {
    func menuControllerDidSelectRow(indexPath:NSIndexPath)
    func canEdit(indexPath: NSIndexPath)->Bool
    func deleteAtSelectRow(indexPath:NSIndexPath)
}

class MenuTableViewController: UITableViewController {

    var delegate : MenuTableViewControllerDelegate?
    var tableData : Array<String> = []
    
    override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        return 1
    }
    
    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return tableData.count
    }
    
    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        
        var cell = tableView.dequeueReusableCellWithIdentifier("CELL") as? UITableViewCell
        
        if !(cell != nil) {
            cell = UITableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: "CELL")
            cell!.backgroundColor = UIColor.clearColor()
            cell!.textLabel.textColor = UIColor.darkGrayColor()
            let selectedBackgroundView = UIView(frame: CGRectMake(0, 0, cell!.frame.size.width, cell!.frame.size.height))
            selectedBackgroundView.backgroundColor = UIColor.grayColor().colorWithAlphaComponent(0.2)
            cell!.selectedBackgroundView = selectedBackgroundView
        }
        
        cell!.textLabel.text = tableData[indexPath.row]
        return cell!
    }
    
    override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
        return 50.0
    }
    
    override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
        delegate?.menuControllerDidSelectRow(indexPath)
    }
    
    override func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool {
      var canEdit=delegate!.canEdit(indexPath)
        return canEdit
    }
    
    
    // Override to support editing the table view.
    override func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
        if editingStyle == .Delete {
            delegate?.deleteAtSelectRow(indexPath)
            self.tableView.reloadData()
        }
    }
}


不知道有没有用。。ps:delegate的函数应该直接实现啊。。。干嘛要在其他函数中实现
级别: 侠客

状态: 连续签到 - [637天]
UID: 265261
精华: 0
发帖: 61
可可豆: 3313 CB
威望: 2004 点
在线时间: 513(时)
注册时间: 2013-10-11
最后登录: 2017-09-22
4 楼:  发表于: 2015-01-27 12:05    发自: Web Page
回 2楼(myplxdm) 的帖子
这样啊。

func mf(delegate:LAMDelegate){
        self.delegate = delegate
        
        let v = self.delegate as ViewController
//ViewController 就是 你说的id类。这样做相当于向下类型转换,如果必须这样做的话,最好确认转换是正确地
        v.test()
    }

我试了一下ViewController 的test()方法可以调用
调用delegate的方法我就不多说了。之前的代码有
级别: 新手上路
状态: 连续签到 - [40天]
UID: 421422
精华: 0
发帖: 16
可可豆: 280 CB
威望: 162 点
在线时间: 371(时)
注册时间: 2014-12-25
最后登录: 2017-09-21
5 楼:  发表于: 2015-08-24 10:51    发自: Web Page
解决了么,同求这个问题
级别: 新手上路
UID: 221075
精华: 0
发帖: 3
可可豆: 3 CB
威望: 3 点
在线时间: 51(时)
注册时间: 2013-04-29
最后登录: 2017-06-29
6 楼:  发表于: 2017-06-14 17:20    发自: Web Page
    class func initPlainTableView(frame: CGRect, delegate: UITableViewDelegate, dataSource: UITableViewDataSource) -> UITableView {
        let view = UITableView(frame: frame, style: UITableViewStyle.plain)
        view.delegate = delegate
        view.dataSource = dataSource
        return view
    }

id< UITableViewDelegate >  不需要写成AnyObject<xxx>,直接写UITableViewDelegate即可
描述
快速回复

关注本帖(如果有新回复会站内信通知您)

发帖、回帖都会得到可观的积分奖励。查看论坛积分规则

按"Ctrl+Enter"直接提交
    顶部