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
作为帮助对象,而不是一个新实例,但是是的,您应该更清楚这一点,谢谢。