变量(IBOutlet UITextView)在某些方法中有效但在其他方法中无效

时间:2011-07-08 00:09:45

标签: objective-c ios ipad

我有一个带有此变量的视图控制器:

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

1 个答案:

答案 0 :(得分:0)

我想我知道发生了什么。

在你的FirstViewController声明内部变量(ivar):

IBOutlet UITextView* chat;

然后,另外,您宣布该财产:

@property (nonatomic, retain) UITextView* chat;

除非另行指定,否则每个Objective-C属性都由自动合成的ivar支持,其名称是属性名称,前面带有_前缀(在本例中为_chat)。

因此FirstViewController有两个不同的ivar用于同一事物:chat_chat。我猜测有效的方法使用chat,失败的方法使用_chatself.chat(内部访问_chat)。那,或者相反。

我的建议是你摆脱了所有的ivars,只使用属性访问器(self.propertyName)。这使得属性能够立即轻松地与局部变量区分开来,并且 imho 会产生更易读和可维护的代码。

请注意,您可以在.h.m文件中声明属性。在.m文件中声明的属性只能从该文件中查看。我建议你在.m文件中声明类外的所有不需要的属性。这使ViewController的界面保持精简和干净。

我个人只在我必须重载或覆盖属性访问器时才直接访问ivars,或者这样做会有效地提高性能(这不常见)。