【发布时间】:2016-03-08 15:17:48
【问题描述】:
我有一个应用程序,其中包含用于处理 BT 连接的蓝牙 LE 类。当一个特征值改变时,我希望 BT 类中的代码改变主视图控制器上的按钮状态。我是 obj-c 的新手,通常使用 stackoverflow 来帮助我理解。我在视图控制器中定义了以下内容:
@interface myViewController : UIViewController<CLLocationManagerDelegate, UITableViewDataSource, UITableViewDelegate, UINavigationBarDelegate, UIActionSheetDelegate>
@property (weak, nonatomic) IBOutlet UIButton *eraseButton;
在视图控制器中,我可以愉快地改变按钮状态:
[self.eraseButton setHidden:YES];
和
-(void) deselectEraseButton
{
[self.eraseButton setSelected:NO];
}
在 BT 类中,我尝试了很多事情(更改 viewcontroller 的属性,该属性通过计时器更改按钮状态,调用直接更改按钮状态的方法等)并且虽然执行了代码(我设置了断点myViewController 中的代码),按钮状态没有改变。例如:
myAppDelegate *app = (myAppDelegate *)[[UIApplication sharedApplication] delegate];
app.vCtrl=[[myViewController alloc] init];
[app.vCtrl deselectEraseButton];
我做错了什么,最好的方法是什么?我相信它不应该这么难!
更新:
在蔡志伟的帮助下(谢谢),我做了一些改变,但是还是不行:
我在 myAppDelegate.h 中添加了以下内容:
@property (strong, nonatomic) myViewController* vCtrl;
我在 myAppDelegate.m 中添加了以下内容:
-(void)eraseButton:(BOOL)state{
[vCtrl accessEraseButton:state];
}
在 BT 课程中,我执行以下操作:
[self performSelectorOnMainThread:@selector(test) withObject:nil waitUntilDone:YES];
在该类中使用以下方法:
-(void) test
{
myAppDelegate *app = (myAppDelegate *)[[UIApplication sharedApplication] delegate];
[app eraseButton:0];
}
这称为 myViewController 并在 thread1 上执行以下操作:
-(void) accessEraseButton: (BOOL) state
{
if (state==0)
{
[self.eraseButton setSelected:NO];
[self.view setNeedsDisplay];
}
else
{
[self.eraseButton setSelected:YES];
}
}
然后我添加了[self.view setNeedsDisplay]; 以求好运。按钮仍然没有改变状态,但代码正在运行(我可以打断点并且它在方法上中断并且方法在 thread1 上运行)?!?有什么想法吗?
* 更新 2 *
好的,我已经弄清楚我做错了什么。我在没有正确引用视图控制器的情况下完成了上述所有操作。因此,尽管代码正在执行,但视图控制器的实例不正确,并且所有按钮句柄都为零。我需要在 viewDidLoad 中将以下内容添加到 myViewController.m:
myAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
appDelegate.myViewController = self;
现在可以了。快乐的日子...
【问题讨论】:
标签: ios objective-c uiviewcontroller uibutton