1

UITableView と detailview の間でデータを渡すことによって、detailview の label.text に indexPath.row 番号を出力したいのですが、正しく実行できません。

ViewController.h

#import <UIKit/UIKit.h>
#import "SecondViewController.h"


@interface ViewController : UIViewController<UITableViewDataSource,UITableViewDelegate>{
    NSArray *tableItems;
    NSArray *images;

}

@property (nonatomic,retain) NSArray *tableItems;
@property (nonatomic,retain) NSArray *images;

@end

ViewController.m

#import "ViewController.h"
#import <QuartzCore/QuartzCore.h>
#import "SecondViewController.h"

@interface ViewController ()

@end

@implementation ViewController
@synthesize tableItems,images;
- (void)viewDidLoad
{
    [super viewDidLoad];
    tableItems = [[NSArray alloc] initWithObjects:@"Item1",@"Item2",@"Item3",nil];
    images = [[NSArray alloc] initWithObjects:[UIImage imageNamed:@"clock.png"],[UIImage imageNamed:@"eye.png"],[UIImage imageNamed:@"target.png"],nil];
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
    return tableItems.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{

    //Step 1:Check whether if we can reuse a cell
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];

    //If there are no new cells to reuse,create a new one
    if(cell ==  nil)
    { 
        cell = [[UITableViewCell alloc] initWithStyle:(UITableViewCellStyleDefault) reuseIdentifier:@"cell"];
        UIView *v = [[UIView alloc] init];
        v.backgroundColor = [UIColor redColor];
        cell.selectedBackgroundView = v;
        //changing the radius of the corners
        //cell.layer.cornerRadius = 10;

    }

    //Set the image in the row
    cell.imageView.image = [images objectAtIndex:indexPath.row];

    //Step 3: Set the cell text content
    cell.textLabel.text = [tableItems objectAtIndex:indexPath.row];

    //Step 4: Return the row
    return cell;

}

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath{
    cell.backgroundColor = [ UIColor greenColor];
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{

    SecondViewController *secondViewController = [[SecondViewController alloc] initWithNibName:@"SecondViewController" bundle:nil];

    [secondViewController printRowNumber:indexPath.row+1];

    NSString *selectedRow = [tableItems objectAtIndex:indexPath.row+1];

    secondViewController.selectedRow = selectedRow;

    //[self.navigationController pushViewController:secondViewController animated:YES];
    [self presentViewController:secondViewController animated:YES completion:NULL];
}
@end

SecondViewController.h

#import <UIKit/UIKit.h>
#import "ViewController.h"


@interface SecondViewController : UIViewController{
    IBOutlet UILabel *lbl;
    NSString *selectedRow;

}
@property (nonatomic,retain) UILabel *lbl;
@property (nonatomic,retain) NSString *selectedRow;

- (IBAction)goBack:(id)sender;

-(void) printRowNumber:(int)num;
@end

SecondViewController.m

#import "SecondViewController.h"

@interface SecondViewController ()

@end

@implementation SecondViewController

@synthesize lbl,selectedRow;

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    //[self changeLabel:@"Hello"];
    //lbl.text = @"Hello";
    // Do any additional setup after loading the view from its nib.
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

- (IBAction)goBack:(id)sender{

    //ViewController *firstViewController = [[ViewController alloc] initWithNibName:nil bundle:nil];
    //firstViewController.delegate = self;
    [self dismissViewControllerAnimated:YES completion:NULL];
}

-(void) printRowNumber:(int)num{
    lbl.text = selectedRow;
    NSLog(@"%@",lbl.text);
    NSLog(@"%d",num);
}
-(void) changeLabel:(NSString*)str{
    lbl.text = str;
    //lbl.text = @"Hello";
}
@end

この問題を解決する方法がわからない..これについて助けが必要..

4

5 に答える 5

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

    SecondViewController *secondViewController = [[SecondViewController alloc] initWithNibName:@"SecondViewController" bundle:nil];

    NSString *selectedRow = [tableItems objectAtIndex:indexPath.row+1];

    secondViewController.selectedRow = selectedRow;

    [self presentViewController:secondViewController animated:YES completion:^{
        [secondViewController printRowNumber:indexPath.row+1];
    }];
}

コントローラーを提示すると、SecondViewController のビューが作成されます。したがって、コントローラーを提示する前に -printRowNumber: を呼び出しても、ラベルはまだ作成されません。

于 2012-10-29T05:30:31.953 に答える
1

現在のView Controllerから次のView Controllerに値を渡すだけで、現在のControllerから次のコントローラーの関数を呼び出さないことをお勧めします。オブジェクトの割り当て解除につながります。

値を渡してそのView Controllerをすぐに押して、値を楽しんでください。それがうまくいくことを願っています。

于 2012-10-29T05:15:02.723 に答える
1
[secondViewController printRowNumber:indexPath.row+1];
NSString *selectedRow = [tableItems objectAtIndex:indexPath.row+1];
secondViewController.selectedRow = selectedRow;

didSelect メソッドでこれらの 3 行のコードを見ると、selectedRow 文字列を設定せずにメソッド printRowNumber を呼び出しているため、機能しません。順序を次のように切り替えてみてください。

NSString *selectedRow = [tableItems objectAtIndex:indexPath.row+1];
secondViewController.selectedRow = selectedRow;

[secondViewController printRowNumber:indexPath.row+1];

于 2012-10-29T05:16:49.013 に答える
1

-(void) printRowNumber:(int)numSecondViewController で viewDidLoadのメソッドを呼び出し、 firstViewController で[secondViewController printRowNumber:indexPath.row+1];fromを削除しrowDidSelectます。

- (void)viewDidLoad
{
    [super viewDidLoad];
    [self printRowNumber:[selectedRow intValue]];
}

これを試してみてください....

于 2012-10-29T05:24:59.303 に答える
1

以下を参照してください。コードを少し変更する必要があります。

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

  SecondViewController *secondViewController = [[SecondViewController alloc] initWithNibName:@"SecondViewController" bundle:nil];

  NSString *selectedRow = [tableItems objectAtIndex:indexPath.row+1];

  secondViewController.selectedRow = selectedRow;

  //[self.navigationController pushViewController:secondViewController animated:YES];
  [self presentViewController:secondViewController animated:YES completion:NULL];

  //this is the change you should do.
  [secondViewController printRowNumber:indexPath.row+1];

}
于 2012-10-29T05:26:55.653 に答える