0

テーブルビューにデータを入力して適切に動作する plist (辞書の配列) があります。私はストーリーボードでXcode 4を使用しています。

これで、通常の UIViewController から詳細ビューを作成しました。もちろん、選択した名前を詳細ビューの nameLabel に表示したいと考えています。しかし、私は正しい接続を行うことができません。これまでの私のコードは次のとおりです。

WineObject.m:

#import "WineObject.h"

@implementation WineObject 
@synthesize libraryContent, libraryPlist;

- (id)initWithLibraryName:(NSString *)libraryName {
    if (self = [super init]) {
        libraryPlist = libraryName;
        libraryContent = [[NSArray alloc] initWithContentsOfFile:[[NSBundle mainBundle] 
                                                              pathForResource:libraryPlist ofType:@"plist"]];
}
return self;
}


- (NSDictionary *)libraryItemAtIndex:(int)index {
return (libraryContent != nil && [libraryContent count] > 0 && index < [libraryContent count]) 
? [libraryContent objectAtIndex:index]
: nil;
}

- (int)libraryCount {
    return (libraryContent != nil) ? [libraryContent count] : 0;
}

- (void) dealloc {
    if (libraryContent) [libraryContent release];
    [super dealloc];
}

@end

ViewController.h:

#import <UIKit/UIKit.h>
@class WineObject;

@interface WinesViewController : UITableViewController {
WineObject *wine;
}


@end

ViewController.m:

#import "WinesViewController.h"
#import "WineObject.h"
#import "WineCell.h"

@interface WinesViewController ()

@end

@implementation WinesViewController

- (id)initWithStyle:(UITableViewStyle)style
{
    self = [super initWithStyle:style];
    if (self) {
        // Custom initialization
    }
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
}

- (void)viewDidUnload
{
    [super viewDidUnload];
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}

#pragma mark - Table view data source

- (void)viewWillAppear:(BOOL)animated {
    wine = [[WineObject alloc] initWithLibraryName:@"Wine"];
    self.title = @"Vinene";
    [self.tableView deselectRowAtIndexPath:[self.tableView indexPathForSelectedRow] animated:YES];
}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    // Return the number of sections.
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    // Return the number of rows in the section.
    return [wine libraryCount];
}

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

    WineCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    // Configure the cell...

    cell.nameLabel.text = [[wine libraryItemAtIndex:indexPath.row] valueForKey:@"Name"];
    cell.districtLabel.text = [[wine libraryItemAtIndex:indexPath.row] valueForKey:@"District"];
    cell.countryLabel.text = [[wine libraryItemAtIndex:indexPath.row] valueForKey:@"Country"];
    cell.bottleImageView.image = [UIImage imageNamed:[[wine libraryItemAtIndex:indexPath.row] valueForKey:@"Image"]];
    cell.flagImageView.image = [UIImage imageNamed:[[wine libraryItemAtIndex:indexPath.row] valueForKey:@"Flag"]];
    cell.fyldeImageView.image = [UIImage imageNamed:[[wine libraryItemAtIndex:indexPath.row] valueForKey:@"Fylde"]];
    cell.friskhetImageView.image = [UIImage imageNamed:[[wine libraryItemAtIndex:indexPath.row] valueForKey:@"Friskhet"]];
    cell.garvesyreImageView.image = [UIImage imageNamed:[[wine libraryItemAtIndex:indexPath.row] valueForKey:@"Garvesyre"]];

    return cell;
}

#pragma mark - Table view delegate

@end

WineCell.h:

#import <UIKit/UIKit.h>

@interface WineCell : UITableViewCell

@property (nonatomic, strong) IBOutlet UILabel *nameLabel;
@property (nonatomic, strong) IBOutlet UILabel *districtLabel;
@property (nonatomic, strong) IBOutlet UILabel *countryLabel;
@property (nonatomic, strong) IBOutlet UIImageView *bottleImageView;
@property (nonatomic, strong) IBOutlet UIImageView *flagImageView;
@property (nonatomic, strong) IBOutlet UIImageView *fyldeImageView;
@property (nonatomic, strong) IBOutlet UIImageView *friskhetImageView;
@property (nonatomic, strong) IBOutlet UIImageView *garvesyreImageView;

@end
4

1 に答える 1

1

インターフェイスに XIB を使用していますか、それともプログラムで生成していますか?


XIB を使用している場合、問題はそれをロードしていないことです。

変化する

winesDetailViewController = [[WinesDetailViewController alloc] init];

winesDetailViewController = [[WinesDetailViewController alloc] initWithNibName:@"YourNibNameHere" bundle:nil];


または、プログラムで生成する場合は、最初に nameLabel を設定する必要があります。そうしないと、nil になります。@synthesize は変数を設定しません。外部から設定できるようにゲッターとセッターを生成するだけです。

あなたの中にviewDidAppear:(またはもっと良いのはあなたの中にinit)追加します:

self.nameLabel=[[UILabel alloc] initWithFrame:CGRectMake(100,100,100,100)];


編集:ストーリーボードを使用している場合は、次のことを行う必要があるようです。

ストーリーボードはすべて関係に関するものです。ストーリー ボード エディター内で、ボタンを追加し、接続先のビュー コントローラーを指定します。同じ考え方が TableView セルにも当てはまります。プロトタイプ テーブル ビュー セルを追加 (およびカスタマイズ) し、関係を割り当てることができます。あなたがそれに与えたいと思う関係はあなたの詳細図です。

1.) UITableViewCell をサブクラス化し、詳細ビューに送信しようとしている辞書であるプロパティを指定します。

2.) セル ( cellForRowAtIndexPath:) を作成するときは、カスタム セルをデキューし、指定したプロパティに辞書を割り当てる必要があります。

3.) 詳細ビューに次の識別子があることを確認します。DetailView

4.) テーブル ビュー コントローラー内に、次のコードを追加します。

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
   if([segue.identifier isEqualToString:@"DetailView"])
   {
      //This works because by the time prepareForSeque: is called, the navigationController has loaded the new view
      ((DetailView *)[[self.navigationController viewControllers] objectAtIndex:0]).dataProperty=((MyCustomTableViewCell *)sender).dataProperty;
   }
}

それはそれを行う必要があります!

于 2012-06-26T00:11:17.787 に答える