Objective c Objective C新手,一种方法可以更改UI元素,另一种方法不能

Objective c Objective C新手,一种方法可以更改UI元素,另一种方法不能,objective-c,xcode,macos,user-interface,xcode6,Objective C,Xcode,Macos,User Interface,Xcode6,提前感谢您的任何意见。我一直在尝试编写一个程序,将串行命令解释为标签中的文本更改。我可以通过按钮附加的操作轻松更改标签文本,但由于某些原因,我在按钮操作之外更改标签文本的所有尝试都不会导致任何更改 // MasterViewController.m // // Created by Daniel Payne on 2/28/15. // Copyright (c) 2015 Daniel Payne. All rights reserved. // #import "MasterVie

提前感谢您的任何意见。我一直在尝试编写一个程序,将串行命令解释为标签中的文本更改。我可以通过按钮附加的操作轻松更改标签文本,但由于某些原因,我在按钮操作之外更改标签文本的所有尝试都不会导致任何更改

//  MasterViewController.m

//
//  Created by Daniel Payne on 2/28/15.
//  Copyright (c) 2015 Daniel Payne. All rights reserved.
//

#import "MasterViewController.h"

@interface MasterViewController ()

@property (strong) IBOutlet NSTextField *score;
@property (nonatomic, strong) ORSSerialPort *serialPort;
@property (nonatomic, strong) MasterViewController *masterView;
@end

static MasterViewController *serialPortHelper = nil;
void connectPort(void) {

    ORSSerialPort *serialPort = [ORSSerialPort serialPortWithPath:@"/dev/tty.usbmodem1411"];
    serialPortHelper = [[MasterViewController alloc] init];
    serialPortHelper.serialPort = serialPort;
    serialPort.delegate = serialPortHelper;
    serialPort.baudRate = @9600;
    NSLog(@"port open");
    [serialPort open];

}
int main(int argc, const char * argv[]) {
    connectPort();

    return NSApplicationMain(argc, argv);

}



@implementation MasterViewController
- (IBAction)pushButton:(id)sender {
            [self.score setStringValue:@"1"]; //works
}

- (void)viewDidLoad {

    [super viewDidLoad];

}



-(void)awakeFromNib
{

        NSLog(@"View controller instance with view: %@", self.view);



}



- (void)serialPort:(ORSSerialPort *)serialPort didReceiveData:(NSData *)data
{
    NSString *string = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];

    if ([string rangeOfString:@"g"].location == NSNotFound) {

        NSLog(@"no goal");
    } else {
        [self.score setStringValue:@"1"]; //does not work
        NSLog(@"GOOOOAL");

    }

}

- (void)serialPortWasRemovedFromSystem:(ORSSerialPort *)serialPort
{
    self.serialPort = nil;
}

- (void)serialPort:(ORSSerialPort *)serialPort didEncounterError:(NSError *)error
{
    NSLog(@"%s %@ %@", __PRETTY_FUNCTION__, serialPort, error);
}

- (void)serialPortWasOpened:(ORSSerialPort *)serialPort
{
    NSLog(@"Serial port %s was opened", [serialPort.name UTF8String]);

}




@end

侦听串行端口的MasterViewController实例与您在屏幕上看到的实例不同

您创建一个新变量并将其分配给一个静态变量-这与您从nib加载并连接所有出口的变量不同


在两种方法中记录
self
,以进行确认

为了澄清我的问题,我是否缺少从serialPort或其他方法更改标签文本所需的任何内容?请检查是否在主线程上调用了
serialPort:didReceiveData
[NSThread isMainThread]
)。如果没有,这可能就是您没有看到(某些)UI更新的原因。如果在主线程上调用serialPort:DidReceiveData,会是什么样子?在哪里可以找到它?在该方法中设置一个断点,并在调试器中键入
expr[NSThread isMainThread]
。你得到了什么结果?或者,添加
NSLog(@“isMainThread=%d”,NSThread.isMainThread)
在方法内部并检查控制台输出:再次,您得到了什么结果?
serialPort:didReceiveData
肯定正在运行,我看到了表明这一点的
Goooal
的NSLog。一旦
connectPort
初始化并开始接收数据,就会调用它。指定的代码行虽然完全相同,但在一种方法中更改标签,而在另一种方法中不执行任何操作。为此,如果您将
connectPort()
中的代码移动到
-viewDidLoad
中,我希望您会看到此操作开始工作。这并不是说这是构造此代码的理想方式,但这是一个开始。@AndrewMadsen除非您使用
self
作为帮助对象,而不是一个新实例,但是是的,您应该更清楚这一点,谢谢。