2016-01-29 24 views
7

file dự án:

https://jumpshare.com/v/Otai3BBXYwfvyz8jb53kđộng Tạo tế bào UITableView và Headrs

(Sẽ là khôn ngoan để xem những để xem cấu trúc của dự án)

Vấn đề:

Ok, vì vậy tôi theo sau một tutorial tạo UITableView với tiêu đề và sau đó là nội dung ô.

Mã hoạt động và chạy tốt, Bây giờ tôi muốn mở rộng ngoài hướng dẫn đó và tự động tải nội dung đó bằng alamofire và SwiftyJSON.

Trong hướng dẫn này, các mã được sử dụng là như vậy:

func getSectionsFromData() -> [Sections] { 

    var sectionsArray = [Sections]() 

    let animals = Sections(title: "Animals", objects: ["Cats", "Dogs", "Birds", "Lions"]) 


    sectionsArray.append(animals) 

    return sectionsArray 


} 

Những gì tôi cố gắng làm là:

Alamofire.request(.GET, url).validate().responseJSON { response in 
     switch response.result { 
     case .Success: 
      if let value = response.result.value { 
       let json = JSON(value) 

       for (_, subJson) in json { 
        for (year, content) in subJson { 
         let title = year 
         let objects = content 

         sectionsArray.append(Sections(title: title, objects: objects)) 

        } 

       } 
      } 
     case .Failure(let error): 
      print(error) 
     } 
    } 

Nếu tôi in ra kết quả họ hiển thị trong giao diện điều khiển - vì vậy tôi biết việc nhận và lặp của JSON hoạt động. sau đó tôi thêm vào trong

let title = year 
let objects = content 

sectionsArray.append(Sections(title: title, objects: objects)) 

Nhưng trên dòng này:

sectionsArray.append(Sections(title: title, objects: objects))

tôi nhận được lỗi này:

cannot convert value of type 'JSON' to expected argument type '[String]'

Đây là JSON Tôi đang sử dụng:

{"posts": [ 
{ 
    "Category1": [ 
     "Post1cat1" 
    ], 
    "Category2": [ 
     "Post1cat2", 
     "Post2cat2" 
    ] 
} 
]} 

Ai đó có thể giúp tôi? Tôi có thể đi sai hướng ở đây Tôi muốn lặp qua JSON và hiển thị các danh mục dưới dạng tiêu đề và các bài đăng trong một ô của bảng.

chỉnh sửa: 1/29/2016

như vậy, tôi đã thay đổi vòng lặp để:

for (_, subJson) in json { 
       for (index, data) in subJson { 
        for (title, objects) in data { 
         sectionsArray.append(Sections(title: title, objects: objects.self.arrayValue.map { $0.string!})) 


        } 

       } 

      } 

Vẫn không có may mắn. Khi tôi thêm ở một số bản in (dưới: sectionsArray.append) để kiểm tra nếu có dữ liệu:

print("--") 
print(title) 
print(objects.self.arrayValue.map { $0.string!}) 
print(Sections(title: title, objects: objects.self.arrayValue.map { $0.string!})) 

tôi nhận được kết quả này trong bảng điều khiển

--

Category1

["Post1cat1"]

Sections(headings: "Category1", items: ["Post1cat1"])

--

Category2

["Post1cat2", "Post2cat2"]

Sections(headings: "Category2", items: ["Post1cat2", "Post2cat2"])

nào cho thấy rằng thông tin là có, tuy nhiên khi tôi chạy ứng dụng vẫn không có kết quả nào, nó chỉ là JSON và phần được xác định ban đầu ở trên.

Trả lời

3

Trong phương pháp phân tích thứ hai (sau khi chỉnh sửa), bạn đang lặp lại trên mảng trong vòng cuối cùng, do đó, hoặc bạn có thể tạo mảng có và thêm mỗi phần tử riêng biệt, như trong ví dụ:

for (title, data) in subJson { 
    var elements: [String] = [] 

    for (_, object) in data { 
     if let stringELement = object.rawString() { 
      elements.append(stringELement) 
     } 
    } 

    sectionsArray.append(Sections(title: title, objects: elements)) 
} 

hoặc nếu bạn thích, bạn có thể sử dụng mảng liệu đúc từ đối tượng JSON như trong ví dụ này:

for (_, subJson) in json["posts"] { 
    for (title, data) in subJson { 
     let optionalCastedObjects = data.arrayObject as? [String] 
     let unwrappedObjects = optionalCastedObjects ?? [] 
     let section = Sections(title: title, objects: unwrappedObjects) 

     sectionsArray.append(section)       
    } 
} 

Điều đó sẽ khắc phục vấn đề biên dịch được đề cập.

Nhưng cuối cùng hãy nhớ rằng bạn đang sử dụng gọi lại không đồng bộ (trong GET request) của bạn theo phương thức getSectionsFromData đồng bộ. Và bạn sẽ luôn trả về mảng trước khi các giá trị từ cuộc gọi lại đó (clojure) sẽ nối thêm dữ liệu mới. Điều đó sẽ gây ra, rằng bạn sẽ không bao giờ hiển thị dữ liệu mà bạn đã tìm nạp theo cách đó.

CẬP NHẬT

Để làm điều đó, bạn nên cấu trúc lại phương pháp getSectionsFromData của bạn như dưới đây.

func getSectionsFromData(completion: ([Sections]) ->()) { 
    var sectionsArray = [Sections]() 

    Alamofire.request(.GET, url).validate().responseJSON { response in 
     switch response.result { 
     case .Success: 
      if let value = response.result.value { 
       let json = JSON(value) 

       for (_, subJson) in json["posts"] { 
        for (title, data) in subJson { 
         let optionalCastedObjects = data.arrayObject as? [String] 
         let unwrappedObjects = optionalCastedObjects ?? [] 
         let section = Sections(title: title, objects: unwrappedObjects) 

         sectionsArray.append(section) 
        } 
       } 

       completion(sectionsArray) 
      } 
     case .Failure(let error): 
      print(error) 
     } 
    } 
} 

Và các phần liên quan trong lớp UITableViewController của bạn.

var sections: [Sections] = [] 

override func viewDidLoad() { 
    super.viewDidLoad() 

    SectionsData().getSectionsFromData { [weak self](sections: [Sections]) ->() in 
     self?.sections = sections 
     self?.tableView.reloadData() 
    } 
} 
+0

Vấn đề không phải với phân tích cú pháp, đã hoạt động tốt. vấn đề đã khiến họ hiển thị trong bảng. nó không cập nhật. – MarkP

+0

Vui lòng thử phần sau sau tiêu đề UPDATE.'Làm việc cho tôi' :) –

-1

Từ các tài liệu SwiftyJSON:

for (key,subJson):(String, JSON) in json { 
    //Do something you want 
} 

Điều này cho thấy rằng subJson là loại JSON.Tuy nhiên, xây dựng mục của bạn trong ví dụ đầu tiên là:

Sections(title: "Animals", objects: ["Cats", "Dogs", "Birds", "Lions"]) 

Trong ví dụ thứ hai của bạn, bạn đang gọi nó như:

Sections(title: title, objects: objects) 

Trừ khi bạn đã thay đổi các nhà xây dựng, nó mong objects là một mảng chuỗi, không phải JSON. Đây là lý do tại sao bạn nhận được một lỗi nói Swift không thể chuyển đổi JSON thành Chuỗi. Trong trường hợp của bạn, objects JSON thực sự là một mảng các chuỗi, vì vậy bạn cần phải sử dụng một cái gì đó như:

Sections(title: title, objects: objects.arrayValue.map { $0.string!}) 
+0

soo tôi đã cố gắng: sectionsArray.append (Phần (tiêu đề: tiêu đề, các đối tượng: objects.arrayValue.map {$ 0.string!})) Và chạy mô phỏng - tất cả những gì cho thấy là các tế bào động vật không phải bất kỳ các mục mới, không có lỗi nào – MarkP

+0

Tôi đã thêm các tệp dự án nếu có. – MarkP

+0

Tôi đang làm việc và trang web đó bị chặn. Tôi sẽ xem xét khi tôi về nhà. Bạn đã sử dụng trình gỡ lỗi để duyệt qua mã và xem tần suất được gọi là phụ lục chưa? – Michael

1

vòng thứ hai của bạn là trên đối tượng mảng do đó trong vòng lặp mà year là giá trị chỉ số và content là đối tượng tại chỉ mục đó.

Bạn cần phải thực hiện một vòng lặp thêm để khắc phục vấn đề ví dụ:

for (_, subJson) in json { 
    for (index, data) in subJson { 
     for (title, objects) in data { 
      sectionsArray.append(Sections(title: title, objects: objects.arrayValue.map { $0.string!})) 

     } 

    } 

} 
+0

Vì vậy, tôi đã thêm vào. Không có gì xảy ra. Trong số tất cả các vòng khi tôi in (sectionsArray) tôi nhận được: [sections.Sections (tiêu đề: "Animals", các mục: ["Cats", "Dogs", "Birds", "Lions"])] không có mục mới – MarkP

+0

Bạn có làm việc trên các tệp dự án không? bạn có thể đưa tệp lên để tải xuống không? – MarkP

+0

Ngoài ra, khi tôi thay đổi các phần của bạn.array (...) thành phần cơ bản: sectionsArray.append (Phần (tiêu đề: "kiểm tra", đối tượng: ["một", "hai"])) với các giá trị mã hoá cứng, nó cũng không hoạt động. : S – MarkP

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