2014-10-15 17 views
9

Tôi mới đến lập trình nhanh và ios nói chung. Tôi đang cố gắng hiển thị chế độ xem phương thức khi ứng dụng của tôi tải lần đầu tiên. Vấn đề tôi đang gặp phải là phương thức của tôi liên tục xuất hiện lặp đi lặp lại. Không chắc tôi sẽ sai đâu.trình bày một phương thức trong viewdidappear với swift

CÂU HỎI THƯỜNG GẶP: Cuối cùng tôi muốn điều này chỉ xảy ra khi người dùng mở ứng dụng lần đầu tiên.

class ViewController: UIViewController { 

    var introModalDidDisplay = false 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib. 
    } 

    override func viewDidAppear(animated: Bool) { 
     super.viewDidAppear(animated) 
     showIntroModal() 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 

    func showIntroModal() { 
     if (!introModalDidDisplay) { 
      println(introModalDidDisplay) 
      introModalDidDisplay = true 
      let intro = self.storyboard?.instantiateViewControllerWithIdentifier("introModal") as IntroModalViewController 
      intro.modalPresentationStyle = UIModalPresentationStyle.FormSheet 
      self.presentViewController(intro, animated: true, completion: nil) 
     } 
    } 
} 
+0

bạn chỉ cần xác định khi ghi đè func viewDidLoad() { super.viewDidLoad() showIntroModal()} –

Trả lời

4

Tìm thấy. Lớp "giới thiệu" của tôi đã được mở rộng ViewController thay vì UIViewController ... có vẻ như đó là xấu. Cảm ơn đã giúp đỡ! Xin lỗi vì cuộc săn đuổi ngỗng hoang dã.

0

Khi bạn đóng xem modal bạn hiển thị ViewController xem bạn một lần nữa, bắn viewDidAppear một lần nữa và nhập một vòng lặp vô hạn thể hiện quan điểm phương thức của bạn, vì quan điểm đầu tiên luôn "xuất hiện"

tôi 'd đề nghị thực hiện điều này trong viewDidLoad, vì chế độ xem được cho là chỉ tải một lần. Hãy thử và thử nghiệm với những sự kiện này và xem khi nào chúng bị sa thải.

Vì chỉ kích hoạt một lần, tôi khuyên bạn nên đặt cờ trong localStorage (plist) cho biết đây có phải là lần đầu tiên người dùng mở ứng dụng hay không. Ví dụ: đặt cờ trong chế độ xem đầu tiên là viewDidLoad và nếu cờ đó sai hiển thị chế độ xem phương thức của bạn và đặt cờ thành đúng.

Dưới đây là một câu hỏi về cách viết trong plists trong Swift: Save Data to .plist File in Swift

+0

Cảm ơn nhận xét! Tôi đã cố gắng viewDidLoad đầu tiên và nó đã ném một lỗi vì (tôi nghĩ) xem đã không hoàn thành bản vẽ vì vậy tôi không thể thêm phương thức của tôi vào nó. Các ý kiến ​​tôi tìm thấy khi tìm kiếm một sửa chữa cho rằng những điều chuyển động được đề xuất để xemDidAppear. – timT

+0

Sử dụng phương pháp tôi đề xuất sử dụng cờ trong localStorage sẽ giải quyết vấn đề của bạn tốt vì nó sẽ chỉ kích hoạt một lần. – lascort

0

Một vài quan sát:

  1. Bạn có nói rằng bạn thấy thông báo này xuất hiện trở lại và một lần nữa khi bạn sử dụng ứng dụng? Điều đó sẽ gợi ý rằng bạn có nhiều phiên bản của bộ điều khiển xem này được khởi tạo. Ví dụ, bạn có thể đang làm một segue trở lại bộ điều khiển xem này (mà sẽ tạo ra thể hiện mới) chứ không phải là thư giãn/popping/sa thải trở lại nó (mà sẽ trở về trường hợp trước đó).

    Tôi khuyên bạn nên có điểm ngắt hoặc tuyên bố ghi nhật ký trong viewDidLoad và xác nhận rằng bạn thấy điều này một lần và chỉ một lần. Nếu bạn nhìn thấy nó nhiều lần, điều đó có nghĩa là bạn có một số tham chiếu vòng tròn giữa các cảnh của bảng phân cảnh (và, BTW, bạn đang từ bỏ bộ nhớ, một loại rò rỉ).

  2. Để xử lý việc này chỉ hiển thị chính nó một lần giữa các lần sử dụng ứng dụng, bạn cần lưu introModalDidDisplay vào một số hình thức lưu trữ liên tục này. Thường thì NSUserDefaults được sử dụng cho việc này. Ví dụ, xác định introModalDidDisplay tra cứu trạng thái trong giá trị mặc định người dùng chuẩn:

    var introModalDidDisplay = NSUserDefaults.standardUserDefaults().boolForKey("introModalDidDisplay") 
    

    Sau đó showIntroModal của bạn có thể cập nhật cài đặt này trong giá trị mặc định người sử dụng:

    func showIntroModal() { 
        if !introModalDidDisplay { 
         introModalDidDisplay = true 
         NSUserDefaults.standardUserDefaults().setBool(true, forKey: "introModalDidDisplay") 
         NSUserDefaults.standardUserDefaults().synchronize() 
    
         let intro = self.storyboard?.instantiateViewControllerWithIdentifier("introModal") as IntroModalViewController 
         intro.modalPresentationStyle = UIModalPresentationStyle.FormSheet 
         self.presentViewController(intro, animated: true, completion: nil) 
        } 
    } 
    

    Rõ ràng, bạn có thể sử dụng bất cứ điều gì lưu trữ liên tục kỹ thuật bạn muốn (plist, archive, mặc định người dùng, Core Data, SQLite), nhưng ý tưởng là như nhau: Lấy trạng thái từ lưu trữ liên tục và một khi màn hình giới thiệu đã được trình bày, cập nhật lưu trữ liên tục cho phù hợp.

    Bằng cách này, bằng cách tìm kiếm điều này trong lưu trữ liên tục, chúng tôi cũng khắc phục các triệu chứng của vấn đề tôi đã thảo luận ở điểm # 1. Nhưng bạn thực sự muốn khắc phục nguyên nhân gốc rễ của điểm đầu tiên đó, bởi vì nếu không bạn sẽ bị rò rỉ bộ nhớ (nếu, tất nhiên, bạn đang thực sự instantiating nhiều bản sao của lớp ViewController).


Bằng cách này, nhìn về tương lai, chứ không phải lưu trữ chỉ là một boolean, tôi có thể đề nghị lưu trữ một định số phiên bản, quá. Bằng cách đó, khi bạn phát hành phiên bản 2.0 của ứng dụng, bạn sẽ có thể quyết định liệu người dùng v1.0 có thể nhìn thấy màn hình giới thiệu được cập nhật lần nữa hay không (hoặc có thể là tùy chỉnh tập trung vào nội dung mới).

+0

Bạn nói đúng, viewDidLoad bị sa thải nhiều lần, nhưng tôi không chắc tại sao. Tôi không có bất kỳ sự phân biệt nào. Nó dường như có một cái gì đó để làm với dòng này: 'self.presentViewController (giới thiệu, hoạt hình: đúng, hoàn thành: nil)' – timT

+0

Tôi đã có thể đoán được vấn đề là ở nơi khác. Bạn phải có các phân đoạn hoặc các lần xuất hiện khác của 'presentViewController' đang trình bày các cá thể mới của bộ điều khiển khung nhìn này. Bạn nên dễ dàng chẩn đoán: thêm điểm ngắt hoặc đăng nhập vào 'viewDidLoad' và sau đó chạy ứng dụng và xác định chuỗi hành động nào tạo ra cá thể mới được tạo. Một khi bạn tìm ra nơi thể hiện mới được tạo ra, nó sẽ dễ dàng nhìn vào mã và tìm ra lý do tại sao/như thế nào. – Rob

+0

BTW, tôi giả định cảnh "giới thiệu" sẽ trở lại với 'ViewController' chính bằng cách gọi' dismissViewControllerAnimated', đúng không? – Rob

Các vấn đề liên quan