2013-01-14 3 views
1

나는 목록에서 배를 선택할 수있는 tableView를 가지고 있으며 탭하면 정보가 다른 화면에 나타나기를 원합니다. 나는 현재이 일을하고 방법은 다음과 같습니다NSUserDefaults가 이전 결과를 반환합니다.

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

cargoShips* ship=[boatsForOwner objectAtIndex:indexPath.row]; 
UITableViewCell *cell = [self.boatsTableView cellForRowAtIndexPath:indexPath]; 

[self performSegueWithIdentifier:@"boatInfoSegue" sender:cell]; 




NSString *nameString = ship.name; 
NSString *sizeString = ship.size; 


NSUserDefaults *shipName = [NSUserDefaults standardUserDefaults]; 
[shipName setObject:nameString forKey:@"globalName"]; 
[shipName synchronize]; 
NSUserDefaults *shipSize = [NSUserDefaults standardUserDefaults]; 
[shipSize setObject:sizeString forKey:@"globalSize"]; 
[shipSize synchronize]; 
[tableView deselectRowAtIndexPath:indexPath animated:YES]; 
} 

그리고는

NSString *getName = [[NSUserDefaults standardUserDefaults] 
        objectForKey:@"globalName"]; 
NSString *getSize = [[NSUserDefaults standardUserDefaults] 
        objectForKey:@"globalSize"]; 

shipNameText.text = getName; 
shipSizeText.text = getSize; 

지금이 그것을 반환하지 않는다는 사실을 제외하고, 좋은 작품을 (다른 파일)에 텍스트로 다시로드 infoView로 이동하기 위해 선택한 셀이지만 이전에 선택한 객체. 그래서 목록에서 첫 번째 객체를 선택하면 null을 반환하고, 다음 객체는 첫 번째 객체에 대해 가져야하는 결과를 얻습니다.

내가 뭘 잘못했는데 어떻게 해결할 수 있습니까?

+0

을 쓴 그 이유는,

#pragma mark - Segue - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { if ([segue.identifier isEqualToString:@"boatInfoSegue"]) { NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow]; CargoShip *ship = boatsForOwner[indexPath.row]; BoatViewController *vc = (BoatViewController *)segue.destinationViewController; vc.ship = ship; } } 

클래스 이름은 대문자로한다 : 내가 당신이라면 나는 이런 식으로했다. –

+0

@NikolaKirev 죄송합니다, 무슨 말씀입니까? 그들은 다른 값을 반환합니다 –

+0

값이 쓰여진 후 * 읽혀지고 있습니까? 몇 가지 중단 점을 설정하십시오. –

답변

2

NSUserDefaults은 개체를 전송하는 것이 아니라 설정을 저장하는 도구입니다. 나는 당신이`shipName`와`shipSize`이 같은 객체 것을 알아야한다 CargoShip

+0

그래, 그 생각,하지만 난 그냥 UserDefaults에 붙어 있으므로보기 사이에 물건을 전송하기위한 더 나은 대안을 찾을 수 없습니다. 그런 다음 대상보기에서이 데이터에 어떻게 액세스합니까? –

+0

대상보기에서 'ship'속성에서 viewDidLoad 또는 viewWillAppear 메서드로 데이터를 읽습니다. – Shmidt

+0

'BoatViewController'에서 @property (nonatomic) 인터페이스에 넣습니다. CargoShip * ship; – Shmidt

0

귀하의 코드에서 볼 수 있습니다. 당신의 문제는 당신이 먼저 seque를 수행하고 NSUserDefaults의 값을 업데이트하는 것입니다.이 라인을 메서드의 끝으로 옮깁니다. [self performSegueWithIdentifier:@"boatInfoSegue" sender:cell]; 이렇게하면 작동하지만 코드를 리팩토링해야합니다.

+0

리 팩터? 그게 무슨 뜻 이죠? 그리고 Segue를 코드 블록의 맨 아래로 옮겼습니다. 여전히 같은 문제입니다. –

관련 문제