Данные не загружаются в подробном представлении - PullRequest
1 голос
/ 27 февраля 2010

Я пытаюсь загрузить данные в детальном представлении. Может кто-нибудь взглянуть и увидеть, почему он не показывает? Он нормально загружается в моем контроллере rootview, но не в подробном представлении.

DetailViewController.m

 #import "DetailViewController.h"


@implementation DetailViewController




- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning]; // Releases the view if it doesn't have a superview
    // Release anything that's not essential, such as cached data
}



- (void)setIcon:(UIImage *)newIcon
{
    [super setIcon:newIcon];
    iconView.image = newIcon;
}

- (void)setPublisher:(NSString *)newPublisher
{
    [super setPublisher:newPublisher];
    publisherLabel.text = newPublisher;
}


- (void)setName:(NSString *)newName
{
    [super setName:newName];
    nameLabel.text = newName;
}



- (void)dealloc
{
    [iconView release];
    [publisherLabel release];
    [nameLabel release];
    [priceLabel release];

    [super dealloc];
}


@end

detailviewcontroller.h

 #import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>




@interface DetailViewController : UIViewController {
    IBOutlet UIImageView *iconView;
    IBOutlet UILabel *publisherLabel;
    IBOutlet UILabel *nameLabel;
    IBOutlet UILabel *priceLabel;

}




@end

RootViewControllerPoints.m

#import "RootViewControllerPoints.h"
#import "DetailViewController.h"




#define USE_INDIVIDUAL_SUBVIEWS_CELL    1

#define DARK_BACKGROUND  [UIColor colorWithRed:151.0/255.0 green:152.0/255.0 blue:155.0/255.0 alpha:1.0]
#define LIGHT_BACKGROUND [UIColor colorWithRed:172.0/255.0 green:173.0/255.0 blue:175.0/255.0 alpha:1.0]


@implementation RootViewController

@synthesize tmpCell, data;


#pragma mark View controller methods

- (void)viewDidLoad
{
    [super viewDidLoad];

    // Configure the table view.
    self.tableView.rowHeight = 73.0;
    self.tableView.backgroundColor = DARK_BACKGROUND;
    self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;

    // Load the data.
    NSString *dataPath = [[NSBundle mainBundle] pathForResource:@"Data" ofType:@"plist"];
    self.data = [NSArray arrayWithContentsOfFile:dataPath];
}


- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation
{
    switch (toInterfaceOrientation) {
        case UIInterfaceOrientationPortrait:
        case UIInterfaceOrientationLandscapeLeft:
        case UIInterfaceOrientationLandscapeRight:
            return YES;
        default:
            return NO;
    }
}



#pragma mark Table view methods

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


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


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

    ApplicationCell *cell = (ApplicationCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil) {

#if USE_INDIVIDUAL_SUBVIEWS_CELL
        [[NSBundle mainBundle] loadNibNamed:@"IndividualSubviewsBasedApplicationCell" owner:self options:nil];
        cell = tmpCell;
        self.tmpCell = nil;

#endif
    }

    // Display dark and light background in alternate rows -- see tableView:willDisplayCell:forRowAtIndexPath:.
    cell.useDarkBackground = (indexPath.row % 2 == 0);

    // Configure the data for the cell.

    NSDictionary *dataItem = [data objectAtIndex:indexPath.row];
    cell.icon = [UIImage imageNamed:[dataItem objectForKey:@"Icon"]];
    cell.publisher = [dataItem objectForKey:@"Publisher"];
    cell.name = [dataItem objectForKey:@"Name"];


    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;

    return cell;
}



- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    DetailViewController *detailViewController = [[DetailViewController alloc] initWithNibName:@"DetailView" bundle:nil];
    detailViewController. = [data objectAtIndex:indexPath.row];
   [self.navigationController pushViewController:detailViewController animated:YES];
    [detailViewController release];
}



@end

Это меня давно беспокоило, я просмотрел множество примеров, учебных пособий и даже спросил других разработчиков iphone. Все источники, кажется, говорят что-то другое.

1 Ответ

1 голос
/ 01 марта 2010

Первая проблема заключается в том, что методы setXXX в DetailViewController пытаются выполнять вызовы к super setXXX, но поскольку DetailViewController является подклассом UIViewController, эти вызовы к super не будут выполняться, потому что UIViewController не имеет таких методов. Удалите вызовы super в методах setXXX.

Вторая проблема заключается в том, что методы setXXX устанавливают элементы управления непосредственно в DetailViewController, но элементы управления не будут доступны, пока не будет загружено представление, поэтому он не будет работать, если методы будут вызваны до вызова pushViewController.

Если вы измените код в didSelectRowAtIndexPath следующим образом, он должен работать:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
   DetailViewController *detailViewController = [[DetailViewController alloc] initWithNibName:@"DetailView" bundle:nil];
   [self.navigationController pushViewController:detailViewController animated:YES];
   [detailViewController setName:@"name here"];
   [detailViewController setPublisher:@"publisher here"];
   [detailViewController setIcon:yourImageVariableHere];       
   [detailViewController release];
}

Хотя указанное выше изменение должно работать, вы можете рассмотреть возможность создания ivars для хранения значений в DetailViewController (вместо использования самих элементов управления пользовательского интерфейса для хранения данных). Затем создайте для них свойства, используя @property и @synthesize. Свойства могут быть установлены сразу после создания DetailViewController, и в viewDidLoad представления вы можете установить элементы управления пользовательского интерфейса в значения свойств. Это даст DetailViewController больше контроля над тем, как обновляется его пользовательский интерфейс, что позволит вам изменять пользовательский интерфейс, не влияя на вызывающих, и его не нужно отображать для установки его свойств.

...