如何在某些情况下更改以编程方式创建的UIButton的标题和动作

问题描述:

我已经在我的ViewController上以编程方式创建了UIButton。我想根据条件对同一个按钮执行不同的操作,并希望更改标题。如何在某些情况下更改以编程方式创建的UIButton的标题和动作

首先我创建按钮这样的:

func createButton(buttonTitle: String,buttonAction: Selector) -> UIButton{ 
    let button = UIButton(type: UIButtonType.System) as UIButton 
    button.frame = CGRectMake(0, 0, 414, 65) 

    button.setTitle(buttonTitle, forState: UIControlState.Normal) 
    button.addTarget(self, action:buttonAction, forControlEvents: UIControlEvents.TouchUpInside) 
    button.setTitleColor(UIColor.whiteColor(), forState:UIControlState.Normal) 
    button.titleLabel?.font = UIFont(name: Variables.MONTESERRAT_REGULAR, size: 20.0) 

    button.backgroundColor = UIColor().blueColor()  //top 
    button.titleEdgeInsets = UIEdgeInsetsMake(0.0,10.0, 10.0, 0.0) 
     return button 
} 

然后我显示这样

override func tableView(tableView: UITableView, viewForFooterInSection section: Int) -> UIView? { 
    let footerView = UIView(frame: CGRectMake(0, 0, tableView.frame.size.width, tableView.frame.size.height)) 

    if(active == true){ 
     bottomButton = createButton("UNPUBLISH", buttonAction: "unPublishToServer") 
    }else if(active == false){ 
     bottomButton = createButton("PUBLISH", buttonAction: "publishToServer") 
    }else{ 
     bottomButton = createButton("Request", buttonAction: "requestItem") 
    } 

    footerView.addSubview(bottomButton!) 
    return footerView 
} 

然后从服务器或条件的特定消息,我改变按钮这样

func publishTripToServer(){ 
    dispatch_async(dispatch_get_main_queue()) { 
     self.bottomButton?.setTitle("UNPUBLISH", forState: UIControlState.Normal) 
    } 
} 

func unPublishTripToServer(){ 
    dispatch_async(dispatch_get_main_queue()) { 
     self.bottomButton?.setTitle("PUBLISH", forState: UIControlState.Normal) 
    } 
} 

我遇到的问题是首先显示标题wh后面的一些背景颜色单击发布或取消发布。第二个问题是按钮不改变动作。

我不完全确定你是什么意思的背景颜色问题。

但是对于你的按钮,做这样的事情不行吗?

func publishTripToServer(){ 

    self.bottomButton = createButton("UNPUBLISH", buttonAction: "unPublishToServer") 
} 



func unPublishTripToServer(){ 
    self.bottomButton = createButton("PUBLISH", buttonAction: "publishToServer") 
} 

我不知道你为什么先前试图更新在后台线程按钮标题,但你不应该永远更新UI元素是异步的。

而且你的按钮动作并没有改变的原因是,你从来没有告诉它改变 - 你只是改变了标题

+0

你的意思是,当我做我不应该删除微调或更改按钮上的异步调用但如果没有,那我该怎么做。我的意思是我不删除微调或更改后台线程上的按钮标题,那么我应该如何做到这一点? – user1hjgjhgjhggjhg

+0

如果您只是更改按钮标题并显示或隐藏活动指示器,则没有理由应该在后台线程上。我不知道您的应用中还有什么,但您发布的内容都不需要在后台运行 – LulzCow