Передача данных из таблицы в веб-просмотр с использованием сегментов - PullRequest
1 голос
/ 30 января 2012

У меня есть таблица, основанная на Sam's Teach Yourself IOS Development's FlowerViewController , который при didSelectRowAtIndesPath переходит на веб-сайт в новом наконечнике (я настроил часть передаваемых данных). МОЙ ВОПРОС: Я хотел бы обновить это, чтобы вместо того, чтобы перейти к перу, чтобы перейти в раскадровке. Я знаю, что вместо использования didSelectRow ... я использую prepareForSegue ... но я не могу выяснить детали ...

my У меня есть ViewController.m со следующим:

- (void)viewDidLoad {
    [self movieData];
    [super viewDidLoad];

    self.title = @"Movies";

    // Uncomment the following line to display an Edit button in the navigation bar for this view controller.
    // self.navigationItem.rightBarButtonItem = self.editButtonItem;
}


#pragma mark -
#pragma mark Table view data source

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return [movieSections count];
}


// Customize the number of rows in the table view.
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return [[movieData objectAtIndex:section] count];
}


// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView 
         cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *CellIdentifier = @"Cell";

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

    // Configure the cell.

    [[cell textLabel] 
     setText:[[[movieData 
                objectAtIndex:indexPath.section] 
               objectAtIndex: indexPath.row] 
              objectForKey:@"name"]];

    [[cell imageView] 
     setImage:[UIImage imageNamed:[[[movieData 
                                     objectAtIndex:indexPath.section] 
                                    objectAtIndex: indexPath.row] 
                                   objectForKey:@"picture"]]];

    [[cell detailTextLabel] 
     setText:[[[movieData 
                objectAtIndex:indexPath.section] 
               objectAtIndex: indexPath.row] 
              objectForKey:@"detail"]];
    cell.detailTextLabel.numberOfLines = 0;

    cell.accessoryType=UITableViewCellAccessoryDisclosureIndicator;
    return cell;
}


// Override to support row selection in the table view.
- (void)tableView:(UITableView *)tableView 
didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

    WebViewController *webViewController = 
    [[WebViewController alloc] initWithNibName:
     @"WebViewController" bundle:nil];

    webViewController.detailURL=
    [[NSURL alloc] initWithString: 
     [[[movieData objectAtIndex:indexPath.section] objectAtIndex: 
       indexPath.row] objectForKey:@"url"]];

    webViewController.title=
    [[[movieData objectAtIndex:indexPath.section] objectAtIndex: 
      indexPath.row] objectForKey:@"name"];

    [self.navigationController pushViewController:
     webViewController animated:YES];

}


#pragma mark -
#pragma mark Table view delegate



#pragma mark -
#pragma mark Memory management

- (void)didReceiveMemoryWarning {
    // Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];

    // Relinquish ownership any cached data, images, etc that aren't in use.
}

- (void)viewDidUnload {
    // Relinquish ownership of anything that can be recreated in viewDidLoad or on demand.
    // For example: self.myOutlet = nil;
}


- (void)movieData {

    NSMutableArray *myMovies;

    movieSections=[[NSMutableArray alloc] initWithObjects:
                    @"Movies",nil];

    myMovies=[[NSMutableArray alloc] init];

    [myMovies addObject:[[NSMutableDictionary alloc]
                           initWithObjectsAndKeys:@"Movie1",@"name",
                           @"1.png",@"picture",
                           @"http://www.url1.com",@"url",@"Some information",@"detail",nil]];
    [myMovies addObject:[[NSMutableDictionary alloc]
                           initWithObjectsAndKeys:@"Movie2",@"name",
                           @"2.png",@"picture",
                           @"http://www.url2.com",@"url",@"Some information 2",@"detail",nil]];
    [myMovies addObject:[[NSMutableDictionary alloc]
                           initWithObjectsAndKeys:@"Movie3",@"name",
                           @"3.png",@"picture",
                           @"http://www.url3.com",@"url",@"Some information 3",@"detail",nil]];
    [myMovies addObject:[[NSMutableDictionary alloc]
                           initWithObjectsAndKeys:@"Movie4",@"name",
                           @"4.png",@"picture",
                           @"http://www.url4.com",@"url",@"Some information 4",@"detail",nil]];

    movieData=[[NSMutableArray alloc] initWithObjects:
                myMovies,nil];
}

Я попытался закомментировать didSelectRowAtIndexPath и добавить следующее для перехода, но ячейка подсвечивается и ничего не происходит (к счастью, она не замирает / не вылетает, но в этом нет ничего положительного)

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {

    if ([[segue identifier] isEqualToString:@"movieSegue"]) {

        NSIndexPath *selectedRowIndex = [self.tableView indexPathForSelectedRow];
        WebViewSegue *_webViewSegue = [segue destinationViewController];
        _webViewSegue.detailURL =
        [[NSURL alloc] initWithString:[[[movieData objectAtIndex:selectedRowIndex.section] objectAtIndex:
                                         selectedRowIndex.row] objectForKey:@"url"]];
    }
}

Тогда я хочу, чтобы он перешел на WebViewSegue

WebViewSegue.h:

@interface WebViewSegue : UIViewController  {
    IBOutlet UIWebView *detailWebView;
    NSURL   *detailURL;
    IBOutlet UIActivityIndicatorView *activity;
    NSTimer *timer;
}

@property (nonatomic, weak) NSURL *detailURL;
@property (nonatomic, weak) UIWebView *detailWebView;
@property (nonatomic, weak) UIActivityIndicatorView *activity;

@end

WebViewSegue.m:

@synthesize detailWebView =_detailWebView;
@synthesize detailURL = _detailURL;
@synthesize activity =_activity;

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

- (void)didReceiveMemoryWarning
{
    // Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];

    // Release any cached data, images, etc that aren't in use.
}

#pragma mark - View lifecycle


- (void)viewDidLoad {
    [super viewDidLoad];

    [detailWebView loadRequest:[NSURLRequest requestWithURL:detailURL]];

    timer = [NSTimer scheduledTimerWithTimeInterval:(1.0/2.0) 
                                             target:self 
                                           selector:@selector(tick) 
                                           userInfo:nil 
                                            repeats:YES];
}

-(void)tick {
    if (!detailWebView.loading) 
        [activity stopAnimating];
    else 
        [activity startAnimating];

}


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

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    // Return YES for supported orientations
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}

-(void)wevView:(UIWebView *)webView didFailLoadWithError:(NSError *)error
{
    UIAlertView* alert = [[UIAlertView alloc] initWithTitle:@"Cannot connect"
                                                    message:@"Please check your connection and try again" 
                                                   delegate:nil 
                                          cancelButtonTitle:@"OK" 
                                          otherButtonTitles:nil];
    [alert show];
}

@end

Ответы [ 2 ]

0 голосов
/ 30 января 2012

Я ответил на ваш вопрос в другом посте на сайте.См. Мой ответ здесь .

В частности, о том, как передать данные из таблицы в следующий переход к раскадровке, сначала создайте свойство для данных в следующем переходе к раскадровке (т. Е. Контроллер представления назначения).Затем установите это свойство в методе prepareForSegue таблицы (контроллер представления источника).

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    // needed if you have multiple segues
    if ([[segue identifier] isEqualToString:@"changeNameAndDate"])
    {
        [[segue destinationViewController] setDataProperty:self.tableData];
        // where dataProperty is the property in the designation view controller
        // and tableData is the data your are passing from the source
    {
}
0 голосов
/ 30 января 2012

Это много кода для переваривания; Вы должны попытаться упростить. Но если я правильно прочитал, ваш основной подход кажется правильным.

Во-первых, установите точку останова на prepareForSegue:sender: и убедитесь, что она вызывается, и что этот идентификатор соответствует ожидаемому.

Затем установите точку останова на viewDidLoad и убедитесь, что она вызывается, когда вы думаете, что это должно быть.

Я бы вытащил loadRequest: в свой собственный метод и вызвал бы его как в viewDidLoad, так и в setDetailURL:. Вполне вероятно, что setDetailURL: вызывается после viewDidLoad, если все это в одной раскадровке.


РЕДАКТИРОВАТЬ То, что я говорю, это то, что prepareForSegue:sender:, вероятно, правильно. Вы проблема в представленном контроллере представления.

- (void)reloadWebView { // Pull the loadRequest: out...
    [self.detailWebView loadRequest:[NSURLRequest requestWithURL:self.detailURL]];
}

- (void)viewDidLoad {
    [super viewDidLoad];
    [self reloadWebView];    // ...and call it both in viewDidLoad...
    ...
}

- (void)setDetailURL:(NSURL *)URL {
    [URL retain];
    [detailURL release];
    detailURL = URL;
    [self reloadWebView]; // ...and in setDetailURL:
}

Также обратите внимание, что для вашего таймера нет причин. Просто включите индикатор прогресса в reloadWebView и выключите его в webViewDidFinishLoad и webView:didFailLoadWithError:. Ваш текущий подход делает невозможным освободить этот контроллер представления, потому что таймер сохраняет его навсегда.

...