2016-04-14 23 views
0

Bu işlevi iki yerden çağırabilmek istedim: Bir metin alanını düzenlemeyi bitirdiğimde, stackView içinde hiçbiri olmadığında yeni bir webView eklemek istiyorum ve ayrıca bir barButtonItem kullanabilmek istiyorum. böyle yap.Varsayılan parametrelerle hızlı fonksiyonlar ayrıca bir seçici mi?

İki sorun yaşıyorum. Bar düğmesi bu işlevi çağırdığında, 'url' parametresi bir nesne olur, UIBarButtonItem yazın. textFieldShouldReturn'dan çağrıldığında, düzgün bir şekilde NSURL olarak gelir. Kullanıcı adres alanına hiçbir şey yazmazsa ve isabetler girerse, boş bir NSURL gelir ve varsayılan değer kullanılmaz. (Ben olmasını isterdim)

Arama, textfieldShouldReturn işlevinden neye benzemeli, böylece bir boşluk varsayılanı tetikler mi?

Ya fonksiyonumun veya düğmenin işlevi çağıracağı ve niçin '' url '' parametresinin 'gönderen' olacağını tahmin ettiğim şey haline gelmesiyle nasıl ilgilenirim?

override func viewDidLoad() { 
    super.viewDidLoad() 

    setDefaultTitle() 

    let add = UIBarButtonItem(barButtonSystemItem: .Add, target: self, action: #selector(ViewController.addWebView)) 
    let delete = UIBarButtonItem(barButtonSystemItem: .Trash, target: self, action: #selector(ViewController.deleteWebView)) 
    navigationItem.rightBarButtonItems = [delete, add] 
} 

    func addWebView(url: NSURL = NSURL(string: "https://www.google.com")!) { 
    let webView = UIWebView() 
    webView.delegate = self 
    stackView .addArrangedSubview(webView) 
    webView.loadRequest(NSURLRequest(URL: url)) 

    webView.layer.borderColor = UIColor.blueColor().CGColor 
    selectWebView(webView) 

    let recognizer = UITapGestureRecognizer(target: self, action: #selector(ViewController.webViewTapped)) 
    recognizer.delegate = self 
    webView.addGestureRecognizer(recognizer) 
} 

    func textFieldShouldReturn(textField: UITextField) -> Bool { 
    if let webView = activeWebView, address = addressBar.text { 
     if let url = NSURL(string: address) { 
      webView.loadRequest(NSURLRequest(URL: url)) 
     } 

    } else if stackView.arrangedSubviews.count == 0 { 
     let address = NSURL(string: addressBar.text!)! 
     addWebView(address) 
    } 
    textField.resignFirstResponder() 
    return true 
} 

cevap

1

Aslında UIBarButtonItem olan gönderen nesnesi aldığınız doğrudur. Hedef-Aksiyon Kakao deseni hakkında duydun mu? Hayır ise, daha fazlasını buradan okuyabilirsiniz: https://developer.apple.com/library/ios/documentation/General/Conceptual/Devpedia-CocoaApp/TargetAction.html

Özellikle ilgili bölüm "Bir Eylem Yöntemi Belirli Bir Formu Olmalıdır".

İşte
func addWebView(sender: NSObject) { 

    addWebView(url: NSURL(string: "https://www.google.com")!) 
} 

private func addWebView(url: NSURL) { 
    //left as is ... 
} 

Dave'in yorumların başına güncelleme:

addWebView aşırı tanıtmak düşünün. Gerçek uygulama yöntemi için farklı ad kullanmak zorunda. Aksi halde, belirtilen derleyici adını çözmek için Swift derleyicisi başarısız olur. oh

class Notifier: NSObject { 

    private var _target: NSObject! 
    private var _action: Selector! 

    func addObserver(target: NSObject, action: Selector) { 
     _target = target 
     _action = action 
    } 

    func invokeMethod() { 

     guard let t = _target else { 
      print("target must be set") 
      return 
     } 

     guard let a = _action else { 
      print("action must be set") 
      return 
     } 
     if t.respondsToSelector(a) { 
      t.performSelector(a, withObject: self) 
     } 
    } 

} 

class Observer: NSObject { 

    func subscribe(notifier: Notifier) { 
     notifier.addObserver(self, action: #selector(Observer.callback)) 
    } 

    func callback(sender: NSObject) { 
     callbackImpl(NSURL(string: "https://www.google.com")!) 
    } 

    private func callbackImpl(url: NSURL) { 
     print("url\(url)") 
    } 
} 

//client's code 
let n = Notifier() 
let o = Observer() 
o.subscribe(n) 
n.invokeMethod() 
+0

: sorunu gösterir

Faydalı kod aşağıda takılır. Söylediğiniz şeyin sesini beğendim, ama Xcode yapmıyor. Çalışmıyor. –

+0

Daha spesifik olabilir misiniz, tam olarak ne işe yaramaz? BTW Özel anahtar kelime ile gerçek uygulama yöntemini (bir URL kabul eder) işaretlemek önemlidir. –

+0

'add add = UIBarButtonItem (barButtonSystemItem: .Add, target: self, eylem: #selector (ViewController.addWebView)) ' çalışmayı durdurur. –