[英]Highlighting a button from another class in objective-C, iOS
我有一個包含用於處理BT連接的藍牙LE類的應用程序。 當特征值更改時,我希望BT類中的代碼更改主視圖控制器上的按鈕狀態。 我是obj-c的新手,通常使用stackoverflow幫助理解。 我在viewcontroller中定義了以下內容:
@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];
我做錯了什么,最好的方法是什么? 我敢肯定,這應該不難!
更新:
在Cai Zhi-Wei Cai的幫助下(謝謝),我進行了一些更改,但可惜它仍然無法正常工作:
我將以下內容添加到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;
現在可以了。 快樂的時光...
因為當您執行app.vCtrl = [[myViewController alloc] init];
,實際上是創建了UIViewController
的新實例,而不是屏幕上的原始實例。
我沒有測試它們,但是您可以通過以下方法實現您想要的目標:
通過Interface Builder:在myAppDelegate
設置UIViewController
的IBOutlet
,將其連接到Interface Builder中的ViewController,然后在myAppDelegate
創建方法以myAppDelegate
進行更改或直接使用myAppDelegate
作為屬性來訪問它。 現在,您可以在BT類中調用它,例如[app deselectEraseButton]
或[app.myViewController deselectEraseButton]
或者如果按鈕是AppDelegate / VC的屬性,甚至可以對按鈕進行操作。
通過Delegate:創建一個@protocol
來為BT類設置一個委托 ,以便它可以在其他類(例如myAppDelegate
內進行回調。
通過NSNotificationCenter:使用- (void)addObserver:(id)notificationObserver selector:(SEL)notificationSelector name:(NSString *)notificationName object:(id)notificationSender
和- (void)postNotificationName:(NSString *)notificationName object:(id)notificationSender userInfo:(NSDictionary *)userInfo
來執行此操作。 這將適用於整個應用程序。
我相信以上三個已經有大量關於SO的代碼示例,只需搜索它們,您將得到所需的東西。
我已經通過原始問題更新了2個更新,這些更新導致了最終的理解和解決方案。 希望它可以幫助其他可能同樣困惑的人!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.