2016-03-21 29 views
0

Uygulamamda bir liste görünümü var ve oradaki hücreleri dinamik olarak ekliyorum. Her bir hücre için bir segue eklemek istiyorum ve kullanıcı bir hücreye bastığında bir UIViewController (FullUser olarak adlandırılır) açın (bu UIViewController kullanıcı tarafından seçilen belirli bir hücreden getirilen, bu segue tarafından geçirilen veri içerecektir yapı SingleUser olarak adlandırılmıştır. SonraNeden göndericiyi readyForSegue yöntemimde hızlıca gönderemiyorum?

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
    var cell: UITableViewCell = tableView.cellForRowAtIndexPath(indexPath) as! SingleEventCell 

    let user = self.items[indexPath.row] as? SingleUser 

    self.performSegueWithIdentifier("fullUserFromListSegue", sender: user) 
    } 

ve: yüzden bu yöntemi var

var fullUserDetails: FullUser? 

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    if (segue.identifier == "fullUserFromListSegue"){ 

     fullUserDetails = segue.destinationViewController as? FullUser 

     //now I want to set the textfield on the other panel: 

     let user2 = sender as? SingleUser 

     var username = user2?.username 

     fullRequestDetails!.username.text = username! 
    } 
} 

ama hata alıyorum ve ben ayıklayıcısında onu kontrol ediyorum zaman user2 nil olduğunu görüyoruz. Neden öyle? Orada bir SingleUser nesnesi saklamak istiyorum, oraya nasıl geçebilirim?

+0

(sizin kadar olabildiğince ! unwrapping kuvvetini kaçınmalıdır) yerine kuvvet unwrap kullanmanın if yılında isteğe bağlı öğeleri unwrapping öneririm her iki durumda da aynı. Varsayımlarınızı kontrol etmek için çalışırken bu türleri kontrol etmek için 'dynamicType' özelliğini kullanmayı deneyebilirim. Yazdırmayı deneyin ("Gönderen Türü \ (sender.dynamicType)") 'yorumunuzu burada bulabilirsiniz. – JMFR

+0

Bu sorudaki cevabın size yardımcı olup olmadığını bildirin: http://stackoverflow.com/questions/35849931/getting-object-for-tapped-uitableviewcell-in-new-uiview/35850088 –

+2

"Kullanıcı" değişkeni değil mi? segue yerine gelmeden önce? –

cevap

0

Mantığı prepareForSegue() işlevine taşıyın ve sonra özelliği hedef görünüm denetleyicisine ayarlayın. destinationViewController'un olmasını beklediğiniz sınıfta değil ise, o zaman storyboard'unuzdaki view controller ayarlarını kontrol etmelisiniz.

var fullUserDetails: FullUser? 

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    // check the destintation view controller is of correct class   
    if let fullUserDetails = segue.destinationViewController as? FullUser { 
     let path = self.tableView.indexPathForSelectedRow 
     let user = self.items[path.row] as? SingleUser 

     var username = user?.username 

     fullRequestDetails!.username.text = username! 
    } 
} 
+0

Önerdiğin şeyi yaptım, ama sonra xcode bana burada bir hata gösterdi: 'self.items [path.row] olarak? ... diyerek:' İsteğe bağlı tipin 'NSIndexPath değeri?' unwrapped değil; '!' demek istedin mi ya da '?'? '' '' '' yolunu koydum! '', ama sonra kullanıcıdan bir şey almayı denediğimde sıfırlanıyorum ... bu yüzden sorun şu anda bu 'yol' ile olabilir… – user3766930

+0

I kodunuzun son satırının hemen üstünde bir 'print (kullanıcı adı)' eklendi ve isteğe bağlı ("someUserLogin") 'ı aldım - bana göre iyi görünüyor, ama neden son satırda önerdiğiniz gibi ayarlayamıyorum? Bunun yerine, "önemli hata" alıyorum: "fullRequestDetails! .username.text" satırı için bir Opsiyonel değer ' – user3766930

+0

çıkarılırken beklenmedik bir şekilde sıfır bulundu. Eğer öyleyse kullanıcı adı tanımlanmışsa bakın.Eğer o değilse, onu tanımlamanız veya uygun gördüğünüz gibi fullRequestDetails! .xtxt olarak değiştirmeniz gerekebilir. –

0
Ben kullanıcı ayarlandığında şöyle bir şey bakmak istiyorum böylece, senin FullUser sınıfı bir user özellik eklemek ve UI güncelleştirmek öneririm

:

class FullUser: UIViewController { 
    var user: SingleUser? { 
     didSet { 
      configureView() 
     } 
    } 

    @IBOutlet weak var usernameField: UITextField! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     configureView() // Call configure in viewDidLoad because 
     // your user might be set before the view is loaded 
    } 

    func configureView() { 
     guard let user = user where isViewLoaded() else { return } 
     usernameField.text = user.username 
    } 
} 

Sonra prepareForSegue uygulama can çok daha basit hale gelir. Ayrıca dokümanlar bu `sender` parametrelerdir olmadığı konusunda süper net görünmüyor

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    if let fullUserDetails = segue.destinationViewController as? FullUser, 
    user = sender as? SingleUser { 
     fullRequestDetails.user = user 
    } 
} 
+0

Teşekkürler! Neredeyse işe yarıyor ... Yeni viewController'ı açmayı başardım, bu yüzden segue işe yaradı, ama hemen ardından rastgele bir baskı eklediğimde: 'func configureView() { bekçi izinli kullanıcı = kullanıcı nerede olduğunu GörünLoaded() else {return} o zaman görmedim, bu yüzden hiçbir etiketim belirlenmedi ... Potansiyel olarak gözden kaçırdığım bir şey var mı? – user3766930

+0

Benim için daha da garip çünkü 'didset 'bloğuna' print (user? .username) 'yazdığımda, konsolumda' İsteğe bağlı (" someUserLogin ")' değerini aldım, böylece veriler doğru bir şekilde aktarıldı ama bir şekilde sonra bir şeyler ters gidiyor ... – user3766930

+0

Korumadan önce 'user' ve' isViewLoaded() 'değerlerini kontrol etmeyi deneyin. yazdırma (kullanıcı, isViewLoaded()) '. Ayrıca, 'viewDidLoad()' üzerinde configureView() 'öğesini çağırdığınızdan emin olun, gönderdiğim koddaki açıklamaya bakın. – EmilioPelaez