簡體   English   中英

突出顯示Objective-C,iOS中另一個類的按鈕

[英]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設置UIViewControllerIBOutlet ,將其連接到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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM