2016-05-24 2 views
-5

Я пытаюсь заполнить таблицу в моем приложении, но я не знаю, как создать функцию, чтобы начать ее заполнять. Я хотел бы сделать это, потому что я получаю данные из HTTP-запроса, но массив, который будет содержать его, пуст, если необходимо обновить источник данных tableview. Возможно ли это? Я использую Свифт.Данные загрузки UITableView

Это мой код:

class ContractsViewController: UIViewController, UISearchBarDelegate, UITableViewDelegate, UITableViewDataSource { 

var companyTxt: String = "" 
var descriptionTxt: String = "" 
var idTxt: String = "" 
var dateCreatedTxt: String = "" 
var dateExpirationTxt: String = "" 
var savedData = Dictionary<Int, JSON>() 
var json: JSON = [] 


@IBOutlet weak var searchContracts: UISearchBar! 
@IBOutlet weak var tableView: UITableView! 
@IBOutlet weak var myIndicator: UIActivityIndicatorView! 


override func viewDidLoad() { 
    super.viewDidLoad() 

    preUpload() 

} 

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


func preUpload() { 

    let headers = [ 
     "X-Limit": "5", 
     "X-Sort": "{\"expirationDate\":-1}" 
    ] 


    myIndicator.color = (UIColor.redColor()) 
    myIndicator.startAnimating() 


    Async.background { 

     Alamofire.request(.GET, "https://mydata", headers: headers) 
      .responseJSON { response in 
       switch response.result { 
       case .Success (let data): 

        self.json = JSON(data) 

        let replaced = FindAndReplace().findAndReplace(self.json) 

        for (pos, object): (String, JSON) in replaced { 
         print("") 
         print("pos -> " + pos) 
         self.savedData[Int(pos)!] = object 
        } 

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

     }.main { 

      self.myIndicator.stopAnimating() 

    } 


} 


override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { 
    self.searchContracts.resignFirstResponder() 
} 


// MARK: TableView 


func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
{ 
    //return name.count 
    print("Json count -> " + String(json.count)) 
    return json.count 
} 

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
{ 
    let cell: ServiceContractsCell? = tableView.dequeueReusableCellWithIdentifier("cellServiceContracts", forIndexPath: indexPath) as? ServiceContractsCell 

    let value = self.savedData[(indexPath.row)] 
    let valueMapped = Mapper<ServiceContract>().map(String(value)) 

    cell?.descriptionText.text = valueMapped?.description 



    return cell! 
} 

func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool 
{ 
    return false 
} 

func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) 
{ 
    self.tableView?.deleteRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Top) 

} 

func tableView(tableView: UITableView, editingStyleForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCellEditingStyle 
{ 
    return (UITableViewCellEditingStyle.Delete) 
} 

func tableView(tableView: UITableView, canMoveRowAtIndexPath indexPath: NSIndexPath) -> Bool 
{ 
    return true 
} 

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) 
{ 
    print("row = %d",indexPath.row) 

} 



} 

Спасибо заранее.

Редактировать Я не могу использовать reloadData() и self.tableView.delegate/источник данных в viewDidLoad()

+1

Вам нужно вызвать 'tableView.reloadData()' после того, как вы получили и проанализируете данные JSON. – Larme

+0

Как сказал здесь Larme, вам нужно вызвать reloadData(), чтобы в представлении таблицы отображались новые значения. –

+0

Должен ли я использовать reloadData() в .main? Поскольку у меня есть исключение nil, если я пытаюсь это сделать – Jigen

ответ

0

По вашему вызову Аламо, обновление основного закрытия к этому:

}.main { 
self.myIndicator.stopAnimating() 
self.tableView.reloadData() 
} 
+0

Я не могу найти reloadTable(), только reloadData(), но у меня есть исключение nil, если я пытаюсь использовать этот метод – Jigen

+0

Слишком рано, я исправил его – CodeBender

0

В комментариях вы упомянули, что у вас есть исключение nil, если вы пытаетесь перезагрузить данные. Убедитесь, что ваш TableView подключен к вашему IBOutlet. Затем убедитесь, что у вас есть это в вашем представленииDidLoad.

tableView.delegate = self 
tableView.dataSource = self 

После этого, вы должны быть в состоянии назвать

tableView.reloadData() 

Из основного потока

+0

Я сопоставляю и делегирую в раскадровке и теперь я добавил две строки в viewDidLoad(), я пытаюсь вызвать tableView.reloadData в .main, но у меня все еще есть исключение nil, спасибо в любом случае – Jigen

0

Все обновления пользовательского интерфейса должны быть только в главном потоке, Можете ли вы назвать tableView.reloadData() как ниже

dispatch_async(dispatch_get_main_queue()) {() -> Void in 
     self.tableView.reloadData() 
    } 
Смежные вопросы