2012-05-14 5 views
6

私のアプリでは、私のリストからカテゴリを選択するのにuitableを利用しています。 私の仕事は、いつでもユーザーがセルをクリックまたは選択すると、次のビュー(詳細ビュー)で選択したセルの詳細を表示することができるはずです。詳細ビューでアイテムを選択すると、彼はテーブルビューで戻ることができ、選択されたアイテムをルートコントローラーで見ることができるはずです。詳細ビューコントローラからuitableviewにデータを戻す方法は?

テーブルビューから詳細ビューに正しくナビゲートできますが、詳細ビューで選択されている項目をrootviewcontrollerに表示できません。

この問題で私を助けてください。

enter image description here image私はrootviewコントローラページです。 たとえば、ユーザーが@ "make"を選択すると、@ "make"の関連カテゴリをすべて表示できます 。次のページ(image2)に表示されます。

enter image description here image toは自分の詳細ページです。

ユーザが@ "abarth"を選択した場合、それはrootviewコントローラページ(ページ1)に表示する必要があります。次

はrootviewコントローラページの私のコードです:

- (void)viewDidLoad 
{ 

    self.car = [[NSArray alloc]initWithObjects:@"Make",@"Model",@"Price Min",@"Price Max",@"State",nil]; 


    [super viewDidLoad]; 

} 

-(NSInteger) numberOfSectionInTableView:(UITableView *)tableView 
{ 
    return 1; 
} 

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    return [self.car count]; 
} 



-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *TextCellIdentifier = @"Cell"; 

    UITableViewCell *cell =[tableView dequeueReusableCellWithIdentifier:TextCellIdentifier]; 
    if (cell==nil) 
    { 
     cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:TextCellIdentifier]; 
     cell.accessoryType = UITableViewCellAccessoryNone; 
     cell.selectionStyle = UITableViewCellSelectionStyleNone; 
    } 

     cell.textLabel.text = [self.car objectAtIndex:[indexPath row]]; 
    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; 





     return cell; 
} 



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





     if (0 == indexPath.row) 
    { 
     NSLog(@"0"); 
     self.detailcontroller.title = @"Make"; 
    } 
    else if (1 == indexPath.row) 
    { 
     NSLog(@"1"); 
     self.detailcontroller.title = @"Model"; 
    } 
    else if (2 == indexPath.row) 
    { 
     NSLog(@"2"); 
     self.detailcontroller.title = @"Price Min"; 
    } 
    else if (3 == indexPath.row) 
    { 
     self.detailcontroller.title = @"Price Max"; 
    } 
    else if (4 == indexPath.row) 
    { 
     NSLog(@"3"); 
     self.detailcontroller.title = @"State"; 
    } 
    [self.navigationController 
    pushViewController:self.detailcontroller 
    animated:YES]; 
} 



following is my detail view page code: 

- (void)viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; 

    if ([self.title isEqualToString:@"Make"]) 
    { 
     detail = [[NSArray alloc]initWithObjects:@"Any Make",@"Abarth",@"AC",@"ADAYER",@"Adelaide",@"ALFA ROMEO",@"ALLARD",@"ALPINE-RENAULT",@"ALVIS",@"ARMSTRONG", 
        @"ASTON MARTIN",@"AUDI",@"AUSTIN",@"AUSTIN HEALEY",@"Barossa",@"BEDFORD", 
        @"BENTLEY",@"BERTONE",@"BMW",@"BOLWELL",@"BRISTOL",@"BUICK",@"BULLET", 
        @"CADILLAC",@"CATERHAM",@"CHERY",@"CHEVROLET",@"CHRYSLER",@"CITROEN", 
        @"Country Central",@"CSV",@"CUSTOM",@"DAEWOO",@"DAIHATSU",@"DAIMLER", 
        @"DATSUN",@"DE TOMASO",@"DELOREAN",@"DODGE",@"ELFIN",@"ESSEX", 
        @"EUNOS",@"EXCALIBUR",@"FERRARI",nil]; 

     if ([self.title isEqualToString:@"Abarth"]) 
     { 
      detail = [[NSArray alloc]initWithObjects:@"HI", nil]; 
     } 
    } 
    else if ([self.title isEqualToString:@"Model"]) 
    { 
     detail = [[NSArray alloc]initWithObjects:@"Any Model", nil]; 


    } 
    else if ([self.title isEqualToString:@"Price Min"]) 
    { 
     detail = [[NSArray alloc]initWithObjects:@"Min",@"$2,500", 
        @"$5,000", 
        @"$7,500", 
        @"$10,000", 
        @"$15,000", 
        @"$20,000", 
        @"$25,000", 
        @"$30,000", 
        @"$35,000", 
        @"$40,000", 
        @"$45,000", 
        @"$50,000", 
        @"$60,000", 
        @"$70,000", 
        @"$80,000", 
        @"$90,000", 
        @"$100,000", 
        @"$500,000", 
        @"$1,000,000",nil]; 

    } 
    else if ([self.title isEqualToString:@"Price Max"]) 
    { 
     detail = [[NSArray alloc]initWithObjects:@"Max", 
        @"$2,500", 
        @"$5,000", 
        @"$7,500", 
        @"$10,000", 
        @"$15,000", 
        @"$20,000", 
        @"$25,000", 
        @"$30,000", 
        @"$35,000", 
        @"$40,000", 
        @"$45,000", 
        @"$50,000", 
        @"$60,000", 
        @"$70,000", 
        @"$80,000", 
        @"$90,000", 
        @"$100,000", 
        @"$500,000", 
        @"$1,000,000",nil]; 
    } 
    else if ([self.title isEqualToString:@"State"]) 
    { 
     detail = [[NSArray alloc]initWithObjects:@"Any State", 
        @"Australian Capital Territory", 
        @"New South Wales", 
        @"Northern Territory", 
        @"Queensland",    
        @"South Australia", 
        @"Tasmania", 
        @"Victoria", 
        @"Western Australia",nil]; 
    } 
    [self.tableView reloadData]; 
} 

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
{ 

    return 1; 
} 

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

    return [detail count]; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *CellIdentifier = @"Cell"; 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; 
    } 

    cell.textLabel.text = [detail objectAtIndex: 
          [indexPath row]]; 


    cell.font = [UIFont systemFontOfSize:14.0]; 
    return cell; 



} 


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


    [self.navigationController popViewControllerAnimated:YES]; 

} 

答えて

8

カスタムデリゲートを使用する必要があります。詳細ビューにプロトコルを作成し、それをあなたのrootview.Passに実装し、メソッドを委譲するためのパラメータとして選択した文字列を渡し、デリゲートメソッドからテキストフィールドに表示します。

//something like this 
@interface detailViewController 

// protocol declaration 
@protocol myDelegate 
@optional 
    -(void)selectedValueIs:(NSString *)value; 

// set it as the property 
@property (nonatomic, assign) id<myDelegate> selectedValueDelegate; 

// in your implementation class synthesize it and call the delegate method 
@implementation detailViewController 
@synthesize selectedValueDelegate 
// in your didselectRowAtIndex method call this delegate method 
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 

     [self selectedValueDelegate])selectedValueIs:valueString] ; 
     [self.navigationController popViewControllerAnimated:YES]; 

    } 




@end 

// In your rootViewController conform to this protocol and then set the delegate 

     detailViewCtrlObj.selectedValueDelegate=self; 
//Implement the delegate Method 
    -(void)selectedValueIs:(NSString *)value{ 
     { 
      // do whatever you want with the value string 
     } 
+0

ありがとうございました。 –

1

こんにちは、あなたは、変数を作成することによって、それはあなたもそれを行うことができますon protocol and delegate

私のリンクを参照してくださいプロトコルを使用して を委任しなければならないだろうappdelegateで、プロパティを設定し、他のビューでアクセスします。

YourAppDelegate *appDelegate = (YourAppDelegate *)[[UIApplication sharedApplication] delegate]; 
delegate.yourVariable; 
+0

このappDelegateは可変的なやり方ではありません。ひどく悪い習慣です。 – hahmed

関連する問題