@property не устанавливается с новым значением - PullRequest
1 голос
/ 09 ноября 2009

Я создаю приложение для iphone, которое использует представления таблиц, содержащиеся в UIViewControllers, помещенные в контроллер UINavigation (очень похоже на приложение Contacts). Когда вы касаетесь определенной ячейки таблицы, она помещает новый контроллер представления в контроллер навигации, чтобы позволить вам выбрать значение из списка представления таблицы. Когда вы выбираете и нажимаете «сохранить», он выводит это представление из стека и возвращает вас к первому представлению, где исходное табличное представление должно показывать выбранное вами значение.

Проблема в том, что я сохраняю выбранное значение в @property, расположенном в первом контроллере представления, и кажется, что оно не получает выбранное значение. Это происходит в методе setDiff. Я могу выйти из системы, и, кажется, она была установлена, но она не установлена, когда представление отображается после изменения свойства.

Это код для первого контроллера вида (где выбранное значение из второго контроллера вида будет отображаться после его выбора).

/**
 *
 * ManageWorkoutViewController
 *
 **/
@class ManageWODiffController;

@interface ManageWorkoutViewController : UIViewController <UITableViewDelegate, UITableViewDataSource> {

    IBOutlet ManageWODiffController *workoutDifficultyController;
    IBOutlet UITableView *woTableView;
    IBOutlet UITableViewCell *workoutCommentsCell;
    IBOutlet UITableViewCell *workoutDifficultyCell;
    IBOutlet UITableViewCell *workoutDateCell;
    NSString *workoutDifficulty;
    NSString *workoutDate;
}

@property (nonatomic, retain) UITableView *woTableView;
@property (nonatomic, retain) NSString *workoutDifficulty;
@property (nonatomic, retain) NSString *workoutDate;

-(void)setupWorkoutAddEdit;
-(void)setDiff:(NSString *)value;

@end



#import "ManageWorkoutViewController.h"
@implementation ManageWorkoutViewController

@synthesize woTableView;
@synthesize workoutDifficulty;
@synthesize workoutDate;


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

    UITableViewCell *cell;

    if (indexPath.row == 0) {

        //workout comments
        cell = [tableView dequeueReusableCellWithIdentifier:@"workoutCommentsCell"];
        if (nil == cell) { 
            cell = workoutCommentsCell;
            cell.selectionStyle = UITableViewCellStyleValue1;
        }

    }else if (indexPath.row == 1) {

        //difficulty
        cell = [tableView dequeueReusableCellWithIdentifier:@"workoutDifficultyCell"];
        if (nil == cell) { 
            cell = workoutDifficultyCell;
            cell.selectionStyle = UITableViewCellStyleValue1;
            cell.textLabel.text = self.workoutDifficulty;
        }

    }else if (indexPath.row == 2) {

        //workoutDate
        cell = [tableView dequeueReusableCellWithIdentifier:@"workoutDateCell"];
        if (nil == cell) { 
            cell = workoutDateCell;
            cell.selectionStyle = UITableViewCellStyleValue1;
            cell.textLabel.text = self.workoutDate;
        }

    }//end if-else


    return cell;

}//end cellForRowAtIndexPath


- (NSInteger)tableView:(UITableView *)tv numberOfRowsInSection:(NSInteger)section {

    return 3;

}//end numberOfRowsInSection


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

    self.workoutDifficulty = value;
    [woTableView reloadData];
    NSLog(@"setter: workoutDifficulty set as: %@", self.workoutDifficulty);

}//end setDiff


-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {


    switch (indexPath.row) {

        case 0:
            //do nothing no nav-view here
            break;

        //DIFFICULTY
        case 1:
            workoutDifficultyController.title = @"Workout Difficulty";
            workoutDifficultyController.originalDifficulty = self.workoutDifficulty;//set the selected difficulty string
            [tableView deselectRowAtIndexPath:indexPath animated:YES];
            [(UINavigationController *)self.parentViewController pushViewController:workoutDifficultyController 
                                                                           animated:YES];
            break;

        case 2:
            workoutDateController.title = @"Workout Date";
            [tableView deselectRowAtIndexPath:indexPath animated:YES];
            [(UINavigationController *)self.parentViewController pushViewController:workoutDateController 
                                                                           animated:YES];
            break;


        default:
            break;

    }//end switch



}//end didSelectRowAtIndexPath


- (void)viewWillAppear:(BOOL)animated {

    //setup the UI to add / edit the workout
    [self setupWorkoutAddEdit];

    [super viewWillAppear:animated];

}//end viewWillAppear


-(void)setupWorkoutAddEdit{

    //load the difficulty 
    if (nil == self.workoutDifficulty) {


        switch ([[workout retrieveValueForKey:@"workoutDifficultyId"] intValue]) {
            case 0:
                self.workoutDifficulty = @"Easy";
                break;
            case 1:
                self.workoutDifficulty = @"Medium";
                break;
            case 2: 
                self.workoutDifficulty = @"Hard";
                break;
            default:
                break;
        }

    }//end if nil


    NSLog(@"workoutDifficulty is: %@", self.workoutDifficulty);

}//end setupWorkoutAddEdit

@end

Вот код для ManageWODiffController (где значение выбирается из таблицы и сохраняется).

/**
 *
 * ManageWODiffController
 *
 **/

@class ManageWorkoutViewController;

@interface ManageWODiffController : UIViewController <UITableViewDelegate> {
    IBOutlet UITableView *tableView;
    IBOutlet UITableViewCell *checkCell;
    NSString *selectedDifficulty;
    NSString *originalDifficulty;
    IBOutlet ManageWorkoutViewController *manageWorkoutController;
}

@property (nonatomic, retain) UITableView *tableView;
@property (nonatomic, retain) NSString *selectedDifficulty;
@property (nonatomic, retain) NSString *originalDifficulty;

-(IBAction)cancelDifficulty:(id)sender;
-(IBAction)saveDifficulty:(id)sender;

@end



#import "ManageWODiffController.h"
#import "ManageWorkoutViewController.h"


@implementation ManageWODiffController

@synthesize tableView;
@synthesize selectedDifficulty;
@synthesize originalDifficulty;


-(IBAction)saveDifficulty:(id)sender {

    NSLog(@"[ManageWODiffController.saveDifficulty] returning: %@", self.selectedDifficulty);

    [manageWorkoutController setDiff: self.selectedDifficulty];

    [(UINavigationController *)self.parentViewController popViewControllerAnimated:YES];

}//end saveDifficulty


-(IBAction)cancelDifficulty:(id)sender { /*...*/ }


- (UITableViewCell *)tableView:(UITableView *)tv cellForRowAtIndexPath:(NSIndexPath *)indexPath { /*...*/ }


- (NSInteger)tableView:(UITableView *)tv numberOfRowsInSection:(NSInteger)section { /*...*/ }


 @end

Ответы [ 3 ]

2 голосов
/ 09 ноября 2009

Вы должны попытаться добавить [self.tableView reloadData] к вашему viewWillAppear (между двумя другими операторами) в первом контроллере.

0 голосов
/ 09 ноября 2009

Подход с контекстным объектом: В вашем первом контроллере, ManageWorkoutViewController, создайте объект контекста

@property (nonatomic, retain) NSMutableDictonary *workout;

В ячейке таблицы, где показана сложность, ее следует выбрать из

[workout objectForKey:@"Difficulty"];

Сделайте то же самое во втором контроллере (ManageWODiffController).

Тогда в первом вы идете так

//DIFFICULTY
    case 1:
       ManageWODiffController *diffController = [[ManageWODiffController alloc]        initWithNibName:@"ManageWODiffController" bundle:[NSBundle mainBundle]];
       diffController.workout = workout;
       [[self navigationController] setNavigationBarHidden:NO animated:NO]; 
       [self.navigationController pushViewController:diffController animated:YES];
       [diffController release];
       diffController = nil; 
          break;

Во втором контроллере это должно быть похоже на

-(IBAction)saveDifficulty:(id)sender
{
    [workout setObject: selectDifficulty forKey:@"Difficulty"];
}

Затем, поместив сложность в контекст тренировки, вставьте второй контроллер.

[[self navigationController] popViewControllerAnimated:YES];

Если вы это сделаете, то

[self.tableView reloadData];

в первом контроллере должно хватить чтобы все заработало

0 голосов
/ 09 ноября 2009

Как насчет этого ...

...
//difficulty
cell = [tableView dequeueReusableCellWithIdentifier:@"workoutDifficultyCell"];
if (nil == cell) { 
    cell = workoutDifficultyCell;
    cell.selectionStyle = UITableViewCellStyleValue1;
}
cell.textLabel.text = self.workoutDifficulty;
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...