2017-02-21 31 views
0

Прежде всего, моя проблема серьезна & не для тех, кто только желает назначить отрицательную обратную связь или просто для редактирования & получить цель вознаграждения.Как получить доступ к различным свойствам или атрибутам выбранного объекта среди массива объектов в методе метода prepareForSegue

моя проблема сложна для передачи, но я стараюсь изо всех сил передать полную проблему. На самом деле у меня есть два вида таблицы и два файла Json в backend и AVPlayerViewController. Во-первых ALLL firstTableViewController показывает первый файл, который содержит JSON Этого Json Data

[{ 
    "id": "0", 
    "name": "Religion" 
}, { 
    "id": "1", 
    "name": "News" 
}, { 
    "id": "2", 
    "name": "Sport" 
}, { 
    "id": "3", 
    "name": "Doc" 
}, { 
    "id": "4", 
    "name": "Kids" 
}, { 
    "id": "5", 
    "name": "Music" 
}, { 
    "id": "6", 
    "name": "Movie" 
}, { 
    "id": "7", 
    "name": "Entr" 
}, { 
    "id": "8", 
    "name": "Cooking" 
}, { 
    "id": "9", 
    "name": "All" 
}] 

В SecondViewController, который извлекающий second Json file, содержащий различные ссылки по-категориях, упомянутых в выше первый файл JSON. данные Json File, полученные в моем приложении успешно.

Когда я щелкаю в любой ячейке (содержащей определенную категорию) моего FirstTableViewController это подводит меня к secondTableViewController с title имущества всех объектов, содержащих конкретную категорию (названный в category_name во втором файле JSon), выбранной категории. До сих пор все работает довольно круто. , но проблема, возникающая, когда я нажимал на любой заголовок, должен привести меня в AVPlayerViewController и сыграть соответствующую ссылку livestream. но она дает мне следующее сообщение об ошибке,

* Нагрузочном приложение из-за неперехваченное исключение 'NSRangeException', причину: '* - [NSArrayM objectAtIndex]: индекс 2097174 за пределы [0 .. 32] *** Первый стек броска вызова: (0 CoreFoundation 0x0000000104b0234b __exceptionPreprocess + 1 171 libobjc.A.dylib
0x000000010456321e objc_exception_throw + 48 2 CoreFoundation
0x0000000104a33f1b - [__ NSArrayM objectAtIndex:] + 203 3 AlbTVRadio 0x00000001022bcae1 - [Второй prepareForSegue: отправитель:] + 321 4 UIKit 0x0000000102bbef5f - [UIStoryboardSegueTemplate _performWithDestinationViewController: Отправитель:] + 353 5 UIKit 0x0000000102bbedcd - [UIStoryboardSegueTemplate _perform:] + 82 6
UIKit 0x0000000102bbf08f - [UIStoryboardSegueTemplate выполнения:] + 156 7 UIKit 0x000000010253b52a - [UITableView _selectRowAtIndexPath: анимированные: scrollPosition : notifyDelegate:] + 8 UIKit одна тысяча семьсот шестьдесят-девять 0x000000010253b78d - [UITableView _userSelectRowAtPendingSelectionIndexPath:] + 330 9 UIKit 0x00000001023f12eb _runAfterCACommitDeferredBlocks + 320 10 UIKit 0x00000001023ddf6f _cleanUpAfterCAFlushAndRunDeferredBlocks + 566 11 UIKit 0x000000010240f3da _afterCACommitHandler + 176 12 CoreFou ndation 0x0000000104aa6e17 __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION
+ 23 13 CoreFoundation 0x0000000104aa6d87 __CFRunLoopDoObservers + 391 14 CoreFoundation 0x0000000104a8bb9e __CFRunLoopRun + 1198 15 CoreFoundation
0x0000000104a8b494 CFRunLoopRunSpecific + 420 16 GraphicsServices
0x0000000106784a6f GSEventRunModal + 161 17 UIKit
0x00000001023e4964 UIApplicationMain + 159 18 AlbTVRadio
0x00000001022cd65f Основной + 111 19 libdyld.dylib
0x000000010a00968d начало + 1 20 ???
0x0000000000000001 0x0 + 1) libC++ abi.dylib: оканчивающиеся неперехваченного исключения типа NSException

Я думаю, что проблема заключается в SEGUE коде, который не выбирая точную ChannelObject или Object.livestream

Вот мой код для второго ViewController. который содержит этот второй json-файл. поэтому, пожалуйста, исправьте этот код, если это возможно.

#import "Second.h" 
#import "Channel.h" 
#import "UIImageView+AFNetworking.h" 
#import "Type.h" 
#define getDataUrl @"https://creativestudy.000webhostapp.com/webservices/test.json" 

@interface Second() 

@end 

@implementation Second 
@synthesize tvArray,currentObject; 

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    [self retrieveData]; 



    // Uncomment the following line to preserve selection between presentations. 
    // self.clearsSelectionOnViewWillAppear = NO; 

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

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

#pragma mark - Table view data source 

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

    return 1; 
} 

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

    return tvArray.count; 
} 


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cells" forIndexPath:indexPath]; 

    Channel * ChannelObject; 
    ChannelObject = [tvArray objectAtIndex:indexPath.row]; 

    cell.textLabel.text = ChannelObject.channelTitle; 
    cell.detailTextLabel.text = ChannelObject.channelLivestream; 
    cell.detailTextLabel.hidden = YES; 
    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; 

    NSURL *url = [NSURL URLWithString:ChannelObject.channelImage]; 
    NSURLRequest *request = [NSURLRequest requestWithURL:url]; 
    UIImage *placeholderImage = [UIImage imageNamed:@"placeholder"]; 
    __weak UITableViewCell *weakCell = cell; 
    [cell.imageView setImageWithURLRequest:request placeholderImage:placeholderImage success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image) { 
     weakCell.imageView.image = image; 
     [weakCell setNeedsLayout]; 
    } failure:nil]; 



    // Configure the cell... 

    return cell; 
} 
-(void) getType:(id)typeObject{ 

    currentObject = typeObject; 

} 

/* 
// Override to support conditional editing of the table view. 
- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath { 
    // Return NO if you do not want the specified item to be editable. 
    return YES; 
} 
*/ 

/* 
// Override to support editing the table view. 
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath { 
    if (editingStyle == UITableViewCellEditingStyleDelete) { 
     // Delete the row from the data source 
     [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade]; 
    } else if (editingStyle == UITableViewCellEditingStyleInsert) { 
     // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view 
    } 
} 
*/ 

/* 
// Override to support rearranging the table view. 
- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath { 
} 
*/ 

/* 
// Override to support conditional rearranging of the table view. 
- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath { 
    // Return NO if you do not want the item to be re-orderable. 
    return YES; 
} 
*/ 


// In a storyboard-based application, you will often want to do a little preparation before navigation 
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 
     if ([segue.identifier isEqualToString:@"playVideo"]) { 

      AVPlayerViewController *playerViewController = [segue destinationViewController]; 

      NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow]; 
      Channel * ChannelObject; 
      ChannelObject = [self.tvArray objectAtIndex:(int)indexPath]; 
      NSURL *liveUrl = [NSURL URLWithString:ChannelObject.channelLivestream]; 
      playerViewController.player = [AVPlayer playerWithURL:liveUrl]; 
     [playerViewController.player play]; 

      } 

} 


-(void) retrieveData{ 
    NSURL * url = [NSURL URLWithString:getDataUrl]; 
    NSData * data = [NSData dataWithContentsOfURL:url]; 
    NSArray *jsonArray = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil]; 

    tvArray = [[NSMutableArray alloc] init]; 

    for (int i = 0; i < jsonArray.count; i ++) 
    { 
     NSDictionary *aCategoryJSON = [jsonArray objectAtIndex:i]; 
     NSString *cId = [aCategoryJSON objectForKey:@"id"]; 
     NSString *cTitle = [aCategoryJSON objectForKey:@"title"]; 
     NSString *cCategory = [aCategoryJSON objectForKey:@"category_name"]; 
     NSString *cImage = [aCategoryJSON objectForKey:@"image"]; 
     NSString *cLivestream = [aCategoryJSON objectForKey:@"livestream"]; 
     NSString *cWebsite = [aCategoryJSON objectForKey:@"Website"]; 
     if (cCategory == currentObject.typeName){ 
     [tvArray addObject:[[Channel alloc] initWithChannelId:cId andChannelTitle:cTitle andChannelCategory:cCategory andChannelImage:cImage andChannelLivestream:cLivestream andChannelWebsite:cWebsite]]; 
     } 
     else if ([currentObject.typeName isEqualToString: @"All"]){ 
     [tvArray addObject:[[Channel alloc] initWithChannelId:cId andChannelTitle:cTitle andChannelCategory:cCategory andChannelImage:cImage andChannelLivestream:cLivestream andChannelWebsite:cWebsite]]; 
     } 

    } 
    [self.tableView reloadData]; 
} 

@end 
+0

Пожалуйста, пост полный стек вызовов исключение (один с _Terminating приложение из-за неперехваченное exception _...) –

+0

Вы столкнулись с проблемой из-за используемого массива, поскольку он превышает максимальный предел. возможно, вы должны проверить свою функцию retrieveData. – dreamBegin

+0

Поместите контрольную точку исключения и посмотрите, на какой строке происходит исключение. @Hina – iPeter

ответ

1

Ваша проблема здесь:

ChannelObject = [self.tvArray objectAtIndex:(int)indexPath]; 

Вы бросили объект (экземпляр NSIndexPath) к междунар и Objective-C имеет подведет вас, так как она основана на C, несмотря на то, это бессмысленно.

indexPath является указателем на объект в памяти, поэтому, когда вы отправляете его на int, вы получаете адрес памяти, интерпретируемый как целое число, поэтому вы видите попытку доступа к элементу 2097174 в вашем массиве. Предположительно, вы добавили приведение к int, потому что компилятор говорил вам, что вы не можете использовать indexPath в этой функции.

Что нужно сделать, это использовать indexPath.row, чтобы получить целое число из экземпляра NSIndexPath. Вы можете также использовать более современный синтаксис доступа к массиву и строчной буквы, чтобы начать переменную (прописные буквы для классов):

Channel *channelObject = self.tvArray[indexPath.row]; 
+0

Спасибо за ваш ответ. Позвольте мне попробовать и проверить, что вы сказали и предложили в своем ответе, Но если вы попытаетесь заметить, я уже указал на строку выбранного индекса в 'NSIndexPath * indexPath = [self.tableView indexPathForSelectedRow ]; ', которая находится прямо над двумя строками строки 'ChannelObject = [self.tvArray objectAtIndex: (int) indexPath];' которая находится в этом обсуждении. Но все же, спасибо за ваше предложение, позвольте мне попробовать, надеюсь, вернуться с результатом, каким бы он ни был. , , –

+0

'indexPathForSelectedRow' дает вам' NSIndexPath', как следует из названия. Затем вам нужно использовать 'indexPath.row', чтобы получить выбранную строку. Вы пытаетесь использовать 'indexPath' непосредственно в качестве индекса массива, поэтому вам пришлось отдать его в int и почему вы получаете исключение из массива с сумасшедшим индексом – Paulw11

+0

@ Paul11, довольно классно, он работает как про ... Thumbs up для вашего решения. –