我有一个带有此变量的视图控制器:
IBOutlet UITextView* chat
它适用于该类的某些方法,但不适用于此方法中的“聊天”功能,就像我认为的那样:
// We are being asked to display a chat message
- (void)displayChatMessage:(NSString*)message fromUser:(NSString*)userName ofType:(NSString*)type withKey:(NSString*)key {
[chat appendTextAfterLinebreak:[NSString stringWithFormat:@"%@: %@", userName, message]];
[chat scrollToBottom];
NSLog(@"stuff to us %@: %@ type: %@", userName, message, type);
}
其他人喜欢这样的人:
- (BOOL)textFieldShouldReturn:(UITextField *)theTextField {
if (theTextField == input) {
// processs input
[chatRoom broadcastChatMessage:input.text fromUser:@"me" ofType:@"message"];
NSLog(@"Broadcast Chat Room is: %@", chatRoom);
[chat appendTextAfterLinebreak:[NSString stringWithFormat:@"me: %@", input.text]];
// clear input
[input setText:@""];
}
return YES;
}
当我使用断点时,变量chat在它不工作时会显示0x00。
有没有人有任何想法?
·H:
@interface FirstViewController : UIViewController <RoomDelegate>{
IBOutlet UILabel* label;
IBOutlet UIBarButtonItem *bbiOpenPopOver;
UIPopoverController *popOverController;
ServerListController *serverListController;
Room* chatRoom;
IBOutlet UITextView* chat;
IBOutlet UITextField* input;
Room *newRoom;
}
@property (nonatomic, retain) UILabel *label;
@property (nonatomic, retain) UIBarButtonItem *bbiOpenPopOver;
@property (nonatomic, retain) UIPopoverController *popOverController;
@property (nonatomic, retain) ServerListController *serverListController;
@property(nonatomic,retain) Room* chatRoom;
@property (nonatomic, retain) UITextView* chat;
-(IBAction)togglePopOverController;
@end
答案 0 :(得分:0)
我想我知道发生了什么。
在你的FirstViewController
声明内部变量(ivar):
IBOutlet UITextView* chat;
然后,另外,您宣布该财产:
@property (nonatomic, retain) UITextView* chat;
除非另行指定,否则每个Objective-C属性都由自动合成的ivar支持,其名称是属性名称,前面带有_
前缀(在本例中为_chat
)。
因此FirstViewController
有两个不同的ivar用于同一事物:chat
和_chat
。我猜测有效的方法使用chat
,失败的方法使用_chat
或self.chat
(内部访问_chat
)。那,或者相反。
我的建议是你摆脱了所有的ivars,只使用属性访问器(self.propertyName
)。这使得属性能够立即轻松地与局部变量区分开来,并且 imho 会产生更易读和可维护的代码。
请注意,您可以在.h
和.m
文件中声明属性。在.m
文件中声明的属性只能从该文件中查看。我建议你在.m
文件中声明类外的所有不需要的属性。这使ViewController的界面保持精简和干净。
我个人只在我必须重载或覆盖属性访问器时才直接访问ivars,或者这样做会有效地提高性能(这不常见)。