2009-11-03 2 views
0

Я создаю приложение iphone, и у меня есть табличный вид с некоторыми текстовыми полями внутри ячеек, содержимое полей установлено в viewWillAppear (его сгруппированные поля TableView w/3, которые всегда одинаковы). Содержимое текстовых полей извлекается из методов getter, возвращающих значения из разных переменных класса.Возможная проблема кэширования просмотра?

Проблема, с которой я столкнулась, заключается в том, что геттер, кажется, возвращает исходное значение, а не значение, которое модифицируется методом setter. Переменная класса - это NSMutableString. Возможно ли, что представление кэширует вызов метода?

//header file 
@implementation ManageWorkoutViewController : UIViewController { 
    NSMutableString *workoutDifficulty; 
} 

-(void)setWorkoutDifficulty:(NSString *)value; 
-(NSString *)getWorkoutDifficulty; 

@end 



//implementation file 
-(NSString *)getWorkoutDifficulty { 

    if (nil == workoutDifficulty) { 
     workoutDifficulty = [NSMutableString stringWithString:@"Easy"]; 
    } 

    NSLog(@"getter: Returning workoutDifficulty as: %@", workoutDifficulty); 

    return workoutDifficulty; 

} //end getWorkoutDifficulty 



-(void)setWorkoutDifficulty:(NSString *)value { 

    workoutDifficulty = [NSString stringWithFormat:@"%d", value]; 
    NSLog(@"setter: workoutDifficulty set as: %@", workoutDifficulty); 

}//end setWorkoutDifficulty 


//elsewhere in the implementation another table view is 
//pushed onto the nav controller to allow the user to pick 
//the difficulty. The initial value comes from the getter 
workoutDifficultyController.title = @"Workout Difficulty"; 
[workoutDifficultyController setOriginalDifficulty:[self getWorkoutDifficulty]]; 
[tableView deselectRowAtIndexPath:indexPath animated:YES]; 
[(UINavigationController *)self.parentViewController pushViewController:workoutDifficultyController 
                   animated:YES]; 

//then in that workoutDifficultyController it calls back into the first controller to set the selected value: 
[manageWorkoutController setWorkoutDifficulty:selectedDifficulty]; 
+0

Я думаю, вы имеете в виду, что речь идет об переменной экземпляра, а не переменной класса. Трудно следовать тому, что вы говорите. Это действительно помогает, если вы действительно публикуете соответствующий код. –

+2

Никогда не префикс ваших получателей с помощью «get». Ведущий «get» означает что-то другое в Cocoa, и таким образом это разрушит KVC, на который полагаются многие части Cocoa. http://developer.apple.com/iphone/library/documentation/Cocoa/Conceptual/KeyValueCoding/KeyValueCoding.html –

ответ

0

Вы должны сохранить workoutDifficulty всякий раз, когда вы установите его на новое значение (и отпустить старое значение).

1

У вас здесь много проблем. Во-первых, вы неправильно создаете свои аксессоры. Проблема, которая особенно причиняет вам неприятности эта линия:

workoutDifficulty = [NSString stringWithFormat:@"%d", value]; 

value является NSString здесь. Вы должны получить предупреждение об этом. Я считаю, что «Typecheck Calls to printf/scanf» включен по умолчанию и должен его поймать. workoutDifficulty устанавливается на некоторое случайное число (вероятно, взято из первых 4 байтов value).

Вот что вы, вероятно, имели в виду. Я бы, вероятно, переключил workoutDifficulty на перечисление, но я поддерживаю его как NSString для согласованности с вашим кодом. Я тоже делаю это без свойств, потому что вы это сделали, но я бы использовал свойство здесь.

//header file 
@implementation ManageWorkoutViewController : UIViewController { 
    NSString *_workoutDifficulty; 
} 

-(void)setWorkoutDifficulty:(NSString *)value; 
-(NSString *)workoutDifficulty; // NOTE: Name change. "getWorkoutDifficulty" is incorrect. 

@end 

//implementation file 
-(NSString *)workoutDifficulty { 
    if (nil == workoutDifficulty) { 
     _workoutDifficulty = [@"Easy" retain]; 
    } 

    NSLog(@"getter: Returning workoutDifficulty as: %@", _workoutDifficulty); 

    return _workoutDifficulty; 
} //end workoutDifficulty 

-(void)setWorkoutDifficulty:(NSString *)value { 
    [value retain]; 
    [_workoutDifficulty release]; 
    _workoutDifficulty = value; 
    NSLog(@"setter: workoutDifficulty set as: %@", _workoutDifficulty);  
}//end setWorkoutDifficulty 
Смежные вопросы