Я получаю значения из @protocol, но не могу использовать в UITableViewController? - PullRequest
1 голос
/ 05 сентября 2011

В контроллере addAlarm я объявляю строку NSString, как показано ниже,

   NSString *nameOfAlarm; // in .h

  @property (nonatomic, retain) NSString *nameOfAlarm; //in .h

  @synthesize nameOfAlarm; //in .m

, а в ViewDidLoad я инициализирую ее следующим образом

  nameOfAlarm = [[NSString alloc] initWithString:@"Alarm"];//In ViewDidLoad

, а затем выполняю что-то вродениже

    // Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
NSString *CellIdentifier = [NSString stringWithFormat:@"Cell%d%d", indexPath.section, indexPath.row];

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

if (cell == nil) {
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier] autorelease];
}

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
   // Configure the cell...

if (indexPath.section == 0) {
    UISwitch *mySwitch = [[[UISwitch alloc] initWithFrame:CGRectZero] autorelease];
    cell.accessoryView = mySwitch;
    [(UISwitch *)cell.accessoryView setOn:YES];   // Or NO, obviously!
    [(UISwitch *)cell.accessoryView addTarget:self action:@selector(mySelector:)
                             forControlEvents:UIControlEventValueChanged];
    NSString *cellValue = [NSString stringWithFormat:@"Enable Alarm"];
    cell.textLabel.text = cellValue;
    //return cell;      
}
if (indexPath.section == 1) {
    if (indexPath.row == 0) {
        NSString *cellValue = [NSString stringWithFormat:@"Name "];
        cell.textLabel.text = cellValue;

        NSString *cellValue2 = [NSString stringWithFormat:@"%@",(NSString*)nameOfAlarm];
        cell.detailTextLabel.text = cellValue2;

    }

, поэтому я делаю таблицу перезагрузки в ViewWillAppear, как показано ниже

- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
NSLog(@"ViewWillAppear, The name is  %@",nameOfAlarm);
[self.tableView reloadData];
 }

Я пишу метод делегата, который вызывается другим контроллером следующим образом,

- (void) processName: (NSString *)n{
nameOfAlarm = (NSString *)n;
NSLog(@"Name is %@",nameOfAlarm);
}

Теперь, когда я нажимаю на 0 индекс строки, он переходит к контроллеру имен, просто, .h контроллера имен равен

#import <UIKit/UIKit.h>

@protocol ProcessNameDelegate <NSObject>
@required
- (void) processName: (NSString *)n;
@end

@interface Name : UITableViewController <UITextFieldDelegate>{

id <ProcessNameDelegate> delegate;
    UITextField *name_textField;
}

@property (retain) id delegate;
@property (nonatomic, retain) UITextField *name_textField;

- (void)pressComplete;

@end

, а когда возвращается к предыдущему контроллеру, тогда вызываетсяследующий метод - ViewWillDisappear,

- (void)pressComplete {
    NSString *name = (NSString *)name_textField.text;
[[self delegate] processName:name];
}

Это установит значение nameOfAlarm. Все хорошо, но когда я перезагружаюсь, это не отображается в

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

. Это показывает что-то вроде нижеесли я использую nameOfAlarm в значении ячейки или даже просто делаю NSLog,

    <_UIStretchableImage: 0x14db10> //the first time in nameOfAlarm,

во второй раз, если я зайду в контроллер имен и сделаю это, то напечатает следующим образом

<UILabel: 0x1cd6c0; frame = (13 0; 25 27); text = 'ON'; clipsToBounds = YES; opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x1d75f0>>

или как этоs

<UILabel: 0x179ed0; frame = (101 0; 32 27); text = 'OFF'; clipsToBounds = YES; opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x179f40>>

Я не могу получить проблему, потому что та же самая переменная работает, показывая правильные значения в других методах, но не работает хорошо с

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

Почему?

1 Ответ

1 голос
/ 05 сентября 2011

В processName: вы делаете это:

nameOfAlarm = (NSString *)n;

Заклинание не обязательно, но не повредит.Проблема в том, что вы не удерживаете n, и он может уйти в любую минуту, оставляя вас с висящим указателем.Вам необходимо сделать следующее:

self.nameOfAlarm = n; // which is different from nameOfAlarm = n;

Точечная нотация является просто синтаксическим сахаром для:

[self setNameOfAlarm:n];

Поскольку свойство помечено как retain, установщик свойства, созданный для вас с помощью synthesize сохранит новое значение nameOfAlarm (n) и освободит старое значение nameOfAlarm.

...