Переменная (IBOutlet UITextView), которая работает в некоторых методах, но не в других - PullRequest
0 голосов
/ 08 июля 2011

У меня есть контроллер представления с этой переменной:

IBOutlet UITextView* chat

Он работает в некоторых методах класса, но не, например, в этом методе функции "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 голосов
/ 18 июля 2013

Мне кажется, я знаю, что происходит.

В вашем FirstViewController вы объявляете внутреннюю переменную (ivar):

IBOutlet UITextView* chat;

Затем, кроме того, вы объявляете свойство:

@property (nonatomic, retain) UITextView* chat;

Если не указано иное, каждое свойство Objective-C поддерживается автоматически синтезированным ivar, именем которого является имя свойства с префиксом _ перед ним (в данном случае _chat).

Итак, у FirstViewController есть два разных ивара для одной и той же вещи: chat и _chat.Я предполагаю, что методы, которые работают, используют chat, а те, которые терпят неудачу, используют _chat или self.chat (который обращается к _chat внутри).Это или наоборот.

Я предлагаю вам избавиться от всех иваров и работать только с помощью методов доступа к свойствам (self.propertyName).Это делает свойства мгновенными и легко отличимыми от локальных переменных, а imho приводит к более читаемому и поддерживаемому коду.

Обратите внимание, что вы можете объявлять свойства как в .h, так и в .mфайлы.Свойства, объявленные в файле .m, будут видны только из этого файла.Я предлагаю вам объявить все свойства, которые не нужны вне класса в файле .m.Это делает интерфейс вашего ViewController простым и чистым.

Лично я обращаюсь к иварам напрямую, только когда мне приходится перегружать или переопределять средства доступа к свойствам или если это эффективно повышает производительность (что не так часто встречается).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...