2014-07-12 1 views
1

클래스 중 하나에 다음 코드가 있습니다. 위에서 언급 한 RTATab글로벌 클래스를 호출 할 때 선택 사항을 풀 수 없습니다.

override func tableView(tableView: UITableView!, didSelectRowAtIndexPath indexPath: NSIndexPath!) { 

    parkCode = tableView.cellForRowAtIndexPath(indexPath).text 

    RTATab.codeText.text = parkCode.substringToIndex(3) 
    RTATab.codeLetter.text = parkCode.substringFromIndex(3) 
    self.dismissModalViewControllerAnimated(true) 
} 

내가 만든 다른 클래스 (유형 UIViewController)이며, 그 클래스에 나는이 텍스트 필드의 일부 (codeTextcodeLetter)에 액세스하기 위해 필요에 따라 아래 표와 같은 글로벌 클래스로 선언 그것의 전망에서.

import UIKit 
import messageUI 
import CoreData 
import QuartzCore 

var RTATab : ViewController = ViewController() 

class ViewController: UIViewController, MFMessageComposeViewControllerDelegate { 
    //some code 
} 

나는이 실행

, 나는 선 RTATab.codeText.text = parkCode.substringToIndex(3)can't unwrap optional.none 오류가 발생합니다.

누군가 도와 드릴 수 있습니까? viewController 클래스에 initialiser가 있어야합니까?

감사

+0

parkCode는 어떻게 정의됩니까? – dasdom

+0

'RTATab'과 같이 변수를 이름으로 사용하는 것은 비 관례입니다. 대문자는 유형에 '예약'되어 있습니다. 'RTATab.codeText'를 사용하면 클래스 변수에 대한 참조처럼 보입니다. – GoZoner

+0

parkCode는 var parkCode : NSString?으로 정의됩니다. = "코드 없음" – naughtynaj

답변

0

당신은 셀의 텍스트가 nil 인이 오류를 얻고있다. 이 전무의 경우 parkCode에 메소드를 호출하기 전에 먼저 확인해야합니다 :

let possibleParkCode = tableView.cellForRowAtIndexPath(indexPath).text 
if let parkCode = possibleParkCode { 
    RTATab.codeText.text = parkCode.substringToIndex(3) 
    RTATab.codeLetter.text = parkCode.substringFromIndex(3) 
} 
+0

Didnt work. println 할 때 값이 표시됩니다. 이 오류가 발생한 위치를 잘 모릅니다. – naughtynaj

0

어느 parkCode 또는 RTATab.codeText이 존재하지 않는이 (nil입니다). 둘 중 하나를 참조 해제하기 전에 존재 여부를 확인해야합니다.

override func tableView (tableView: ...) { 
    if let theParkCode = tableView.cellForRowAtIndexPath(indexPath).text { 
    parkCode = theParkCode; 
    if let theCodeText = RTATab.codeText { 
     theCodeText.text = parkCode?.substringToIndex(3) 
    } 
    if let theCodeLetter ... { 
    // ... 
    } 
    } 
} 

참고 : 위의 코드가 ViewController (RTATab의 클래스가) codeTextcodeLetter 위해 해당 인스턴스 변수를 선언하는 방법에 따라 달라집니다 - 내가 선택적 항목으로 가정했습니다. 당신이 실제로 스토리 보드에서 텍스트 필드의 속성을 연결하지 않습니다 RTATab를 초기화하고있는 방법 - RTATab.codeTextRTATab.codeLetternil 때문에

+0

codeLetter는 "@IBOutlet var codeLetter : UITextField"로 선언됩니다. println 문을 수행하면 parkCode에 값이 표시됩니다. 그것이 옳지 않다는 뜻인가요? 위와 같이 if 문을 시도해 보면 코드가 실행됩니다. 그러나 텍스트 필드에 할당하려고하면 같은 오류가 발생합니다. 그래서 기본적으로, 다른 변수를 할당하지만 텍스트 필드에 그것은 나에게 지우기 unwrap 오류를 제공합니다. – naughtynaj

+0

'parkCore'의 타입은'String?'입니다. 나는'parkCode.substringToIndex (3)'을'parkCode? .substringToIndex (3)'로 대체하기 위해 코드를 업데이트했다. 또는 선택적'parkCode'를 사용하는 대신에, 당신은 단지 비 선택적'theParkCode'를 사용할 수 있습니다. – GoZoner

+0

나는 이것을 시도해 봤지만 아무렇게나 잡을 수는 없다. if 문으로 넘어갑니다. println 할 때 값을 표시합니다. – naughtynaj

0

당신은 오류가 있습니다.

var RTATab: ViewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewControllerWithIdentifier("RTA") as ViewController 

하지만, 내 생각 엔 당신이했습니다 뷰 컨트롤러는 점이다 : 당신이 진정으로 바로 뷰 컨트롤러의 글로벌 버전이 필요하면, 당신은 그것을 스토리 보드 ID를주고 같은 것을 사용하여로드해야합니다 것 이미 업데이트하려는 다른 곳에 이미 표시되어있는 경우, "parkCode"값을 저장할 수있는 데이터 구조를 설정하고 표시 할 때 올바른보기 컨트롤러로 다시 가져 오는 것이 좋습니다.

+0

예 다른 뷰 컨트롤러에 데이터를 보내고 텍스트 필드를 업데이트합니다. 이제 그보기 컨트롤러에서 구조체를 만들고 데이터 필드를 업데이트하려고 할 때 데이터를 전달할 수 있지만 텍스트 필드를 사용하는 줄에서 동일한 오류가 발생합니다 ... 어떤 생각입니까? – naughtynaj

관련 문제