2013-06-15 2 views
1

내 아이오스 개발을 시작하고 처음에는 측정 변환기를 만드는 것이 재미있을 것이라고 생각했습니다.테이블 셀에서 이벤트 가져 오기

나는 storyviews를 사용하여 segues가있는 테이블보기, 다른 치수에 해당하는 텍스트 필드와 레이블이있는 사용자 정의 셀을 만들었지 만 지금은 붙어 있고 자습서 나 책에서 대답을 찾을 수 없습니다.

각 셀에는 주어진 치수 (즉, 미터, 센티미터 등)에 해당하는 텍스트 필드가 있습니다. 주어진 행의 텍스트 필드가 편집을 마쳤다는 이벤트를 얻고 계산 후에 다른 텍스트 필드를 변경하는 방법? 사용자가있는 tableView를 제시의 ViewController로의 UITextField의 대리인 설정해야

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UILabel *label; 
    UITextField *field; 
    static NSString *CellIdentifier = @"DimensionCell"; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath]; 
    label = (UILabel *)[cell viewWithTag:1]; 
    field = (UITextField *)[cell viewWithTag:2]; 
    field.delegate = self; 
    NSString *DimensionLabel = [self.dimension objectAtIndex:indexPath.row]; 
    label.text = DimensionLabel; 
    return cell; 
} 
+0

텍스트 필드가 변경 될 때마다 모든 텍스트 필드를 변경해야하므로 모든 텍스트 필드를 변경하고 텍스트 필드가 편집을 마칠 때마다 직접 참조하는 것이 가장 쉽습니다 (또는 원하는 경우 변경할 수 있습니다). 실시간으로 일어난다. – lnafziger

+0

@Inafziger thats 내가 콘센트를 사용하고 싶지 않은 이유. 텍스트 필드가 자동으로 생성되기를 원하기 때문에 배열에 새로운 차원을 추가하면됩니다. 또한 다른 측정 값에 대해 동일한 뷰를 사용하는 데 도움이 될 것입니다. – mjanisz1

+0

어쨌든 데이터 소스를 모두 업데이트해야하므로 데이터 소스를 업데이트하고 테이블 뷰에서 reloadData를 호출하는 것이 가장 쉽습니다. 다른 옵션은 모든 테이블 뷰 visibleCell을 반복하고 원래 코드의 cellForRowAtIndexPath에서와 같이 레이블에 대한 참조를 가져 오는 것입니다. – lnafziger

답변

3

(세포 계산에 필요한 치수 이름 및 값을 포함하는 배열로부터 생성된다).

각 textField 태그를 제공하거나 textFieldDidEndEditing: 대리인의 textField 지점을 확인하여 textField를 식별 할 수있는 indexPath를 찾을 수 있습니다.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    CustomCell *cell = [tableView dequeueReusableCellWithIdentifier:kCellIdentifier 
                  forIndexPath:indexPath]; 

    cell.customTextField.delegate = self; 
    //You can use tag if there is only one section 
    //If there is more than one section then this will be ambiguos 
    cell.customTextField.tag = indexPath.row; 

    //Set other values 

    return cell; 
} 

- (void)textFieldDidEndEditing:(UITextField *)textField{ 

    CGPoint textFieldOrigin = [textField convertPoint:textField.frame.origin toView:self.tableView]; 
    NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:textFieldOrigin]; 
    //Now you can use indexPath for updating your dataSource 

} 
+0

감사합니다! 첫 부분은 잘 작동합니다 .- 나는 텍스트 필드에 갈 수 있습니다. 하지만 이제는 다른 모든 텍스트 필드를 다른 셀에 가져 오는 방법은 무엇입니까? – mjanisz1

+0

@ mjanisz1 이것은 일반적입니다. 셀의 모든 textField에 대리자를 설정해야합니다. 그들은 모두'textFieldDidEndEditing :'메소드를 통과 할 것입니다. indexPath를 사용하여 특정 경로를 찾아내는 방법을 찾아야합니다. 또는 dataSource 및 셀에 대한 추가 정보를 공유 할 수 있습니다. 나는 너에게 제안을 할 수있다. – Anupdas

+0

질문을 편집하여 내가 셀을 만드는 방법을 볼 수 있습니다. textfield.text를 단순한 문자열로 변경하려고 시도했지만, 편집이 끝난 것에서 만 바뀝니다. (사용 가능한 모든 텍스트 필드에 연결하는 방법을 모릅니다.) 당신이 내게 설명하면 나머지는 그냥 사소한 것입니다;) – mjanisz1

0

UITextField 속성 인 restorationId을 사용할 수 있습니다. 이 같은 각 텍스트 필드의 restorationID 보내기

textField.restorationID = @"dimension1"; 
textField.delegate = self; 

그런 다음 텍스트 필드 대리자 메서드를 다음에 당신은 편집 된에 textField 식별 할 수 restorationID를 확인할 수 있습니다.

- (void)textFieldDidEndEditing:(UITextField *)textField 
{ 
    if([textField.restorationID isEqualToString:@"dimension1"]) 
    { 
     // perform calculation and any updation required. 
    } 
} 

차원 이름을 restorationID로 사용하는 것이 좋습니다. 이렇게하면 대리인 메서드에서 텍스트 필드를 식별하는 데 도움이 될 수 있습니다.

관련 문제