2016-04-03 11 views
1

ViewController.swift'da girdim, girişimi kullanmak ve diğer sınıfımda kullanmak istediğim bir metin alanı var, Conjugate.swift. Benim diğer sınıfta ardındanViewController'daki metin alanından giriş alma ve başka bir sınıfta kullanma

import UIKit 

class MainViewController: UIViewController, UITextFieldDelegate { 

@IBOutlet weak var mainTextField: UITextField! 

var input: String! 

override func viewDidLoad() { 
    super.viewDidLoad() 
    mainTextField.delegate = self 
} 

/* KEYBOARD HIDE */ 
func textFieldShouldReturn(textField: UITextField) -> Bool { 
    input = self.mainTextField.text 
    textField.resignFirstResponder() 
    return true; 
} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    } 
} 

Ve: İşte

class Conjugate { 
var infinitive: String!  
var isEndingAr = false 

func conjugate() { 

    // gets verb from text field 
    infinitive = MainViewController().input 

    // checks verb ending and sets value to booleans 
    if (infinitive.hasSuffix("ar")) { 
     isEndingAr = true 
     } 
    } 
} 

alıyorum hata olduğunu:

Ben klavye, gizli şöyle aynı anda girdi yakalama am
fatal error: unexpectedly found nil while unwrapping an Optional value 

MainViewController.swift içinde input'un hala sıfır olduğunu biliyorum. Sadece nedenini bilmiyorum. Neyi yanlış yapıyorum?

cevap

2

infinitive = MainViewController().input, MainViewController()'u yaptığınızda, yalnızca MainViewController'un yeni bir örneğini oluşturur. Bu yeni örnek, hiçbir zaman textFieldShouldReturn'u arayamaz ve bu nedenle input, nil olacaktır. Bunun yerine, Conjugate'dan MainViewController'a bir başvuru ekleyin.

var mainViewController: MainViewController? 

sonra textFieldShouldReturn bir Conjugate oluşturmak ve özelliği atamak: yerine yeni bir görünüm denetleyicisi oluşturmak yerine, conjugate() yöntemde sonra

let conjugate = Conjugate() 
conjugate.mainViewController = self 

, özelliği bakınız:

func conjugate() { 

    // gets verb from text field 
    infinitive = self.mainViewController!.input! 

    // checks verb ending and sets value to booleans 
    if (infinitive.hasSuffix("ar")) { 
     isEndingAr = true 
     } 
    } 
} 

Ayrıca, @emresancaktar'ın da belirttiği gibi, input isteğe bağlı olabilir, çünkü sıfır olabilir. Bununla birlikte, infinitive'un isteğe bağlı olması gerekmez.

+0

Bu sorunumu çözdü, ancak şimdi başka bir sorunum var: MainViewController'daki eşlenik yöntemi nasıl ararım? Conjugate(). Conjugate() bir uygulama kazasında sonuçlanır. – wasimsandhu

+1

Yine, 'Conjugate()' kısmı yalnızca yeni bir nesne oluşturur ve bu yeni nesne başlatılan hiçbir şey olmadığından, 'conjugate()' yöntemindeki kod kilitlenir. Yeni bir nesne oluşturmak yerine, 'conjugate.conjugate()' yapın. Bu, zaten başlatılmış nesneyi kullanır. Ayrıca, daha açıklayıcı isimleri kullanmayı düşünün. En iyi uygulama, nesneleri "isim" isimleriyle ve "fiil" isimleriyle adlandırmaktır. "Konjugat hem bir fiil hem de bir isim (ve bir sıfat) olduğu için, bu adlandırma çok hızlı çok kafa karıştırıcı olacak :) – Hash88

İlgili konular