2015-08-24 2 views
1

В моем приложении у меня есть два вида таблицы. В первом представлении таблицы есть определенное количество ячеек. Эти ячейки всегда будут одинаковыми и никогда не изменятся.Передача данных из одного стола в другой

Смотрите ниже:

enter image description here

Выше представление таблицы всегда будет иметь 3 клетки и никогда больше. На моем сервере у меня есть API, который имеет маршруты для каждой из этих ячеек.

Например:

GET - MyAPI/игра

GET - MyAPI/книга

GET - MyAPI/путешествие

И каждые маршруты отправить спины различных данные.

Что я пытаюсь сделать, так это то, что когда пользователь нажимает на ячейку таблицы, он переводит их в новое представление таблицы, чьи ячейки содержат ответ API.

В настоящее время мой 2ND табличное пуст см ниже:

enter image description here

Это то, что я пытался до сих пор:

import UIKit 

class SectorListTableViewController: UITableViewController { 


struct WeatherSummary { 
    var id: String 
} 

var testArray = NSArray() 
var manuArray = NSArray() 

// Array of sector within our company 
var selectSector: [String] = ["Game", "Book","Travel"] 

override func viewDidLoad() { 
    super.viewDidLoad() 
    self.tableView.rowHeight = 80.0 




    var weatherArray = [WeatherSummary]() 
    var request = NSMutableURLRequest(URL: NSURL(string: "myAPI")!) 
    var session = NSURLSession.sharedSession() 
    request.HTTPMethod = "GET" 
    UIApplication.sharedApplication().networkActivityIndicatorVisible = true 
    //var params = ["email":"\(emailAdd)", "password":"\(pass)"] as Dictionary<String, String> 

    var err: NSError? 
    //request.HTTPBody = NSJSONSerialization.dataWithJSONObject(params, options: nil, error: &err) 
    request.addValue("application/json", forHTTPHeaderField: "Content-Type") 
    request.addValue("application/json", forHTTPHeaderField: "Accept") 

    var task = session.dataTaskWithRequest(request, completionHandler: {data, response, error -> Void in 
     println("Response: \(response)") 
     var strData = NSString(data: data, encoding: NSUTF8StringEncoding) 
     println("Body: \(strData)") 
     var err: NSError? 
     var json = NSJSONSerialization.JSONObjectWithData(data, options: .MutableLeaves, error: &err) as? NSArray 

     UIApplication.sharedApplication().networkActivityIndicatorVisible = true 

     // Did the JSONObjectWithData constructor return an error? If so, log the error to the console 
     if(err != nil) { 

      println(err!.localizedDescription) 
      let jsonStr = NSString(data: data, encoding: NSUTF8StringEncoding) 
      println("Error could not parse JSON: '\(jsonStr)'") 

     } 
     else { 

      UIApplication.sharedApplication().networkActivityIndicatorVisible = false 
      // The JSONObjectWithData constructor didn't return an error. But, we should still 
      // check and make sure that json has a value using optional binding. 
      var newWeather = WeatherSummary(id:"") 

      if let parseJSON = json { 

       for weather in parseJSON { 

        if let id = weather["employeeName"] as? String{ 
         println(" LOOK HERE \(id)") 
         newWeather.id = id 
        } 
       } 

       weatherArray.append(newWeather) 

       self.testArray = parseJSON 


      } 
      else { 
       // Woa, okay the json object was nil, something went worng. Maybe the server isn't running? 
       let jsonStr = NSString(data: data, encoding: NSUTF8StringEncoding) 
       println("Error could not parse JSON: \(jsonStr)") 

      } 


     } 

    }) 



    task.resume() 

    // Uncomment the following line to preserve selection between presentations 
    // self.clearsSelectionOnViewWillAppear = false 

    // Uncomment the following line to display an Edit button in the navigation bar for this view controller. 
    // self.navigationItem.rightBarButtonItem = self.editButtonItem() 



} 

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

// MARK: - Table view data source 

override func numberOfSectionsInTableView(tableView: UITableView) -> Int { 
    // #warning Potentially incomplete method implementation. 
    // Return the number of sections. 
    return 1 
} 

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    // #warning Incomplete method implementation. 
    // Return the number of rows in the section. 
    return self.selectSector.count 
} 


override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCellWithIdentifier("sectorList", forIndexPath: indexPath) as! UITableViewCell 

    // Configure the cell... 

    if selectSector.count > 0 { 

     cell.textLabel?.text = selectSector[indexPath.row] 
    } 

    return cell 
} 


/* 
// Override to support conditional editing of the table view. 
override func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool { 
    // Return NO if you do not want the specified item to be editable. 
    return true 
} 
*/ 

/* 
// Override to support editing the table view. 
override func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) { 
    if editingStyle == .Delete { 
     // Delete the row from the data source 
     tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade) 
    } else if editingStyle == .Insert { 
     // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view 
    }  
} 
*/ 

/* 
// Override to support rearranging the table view. 
override func tableView(tableView: UITableView, moveRowAtIndexPath fromIndexPath: NSIndexPath, toIndexPath: NSIndexPath) { 

} 
*/ 

/* 
// Override to support conditional rearranging of the table view. 
override func tableView(tableView: UITableView, canMoveRowAtIndexPath indexPath: NSIndexPath) -> Bool { 
    // Return NO if you do not want the item to be re-orderable. 
    return true 
} 
*/ 


// MARK: - Navigation 

// In a storyboard-based application, you will often want to do a little preparation before navigation 
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    // Get the new view controller using [segue destinationViewController]. 
    // Pass the selected object to the new view controller. 

    if let destination = segue.destinationViewController as? BioListTableViewController { 
     let indexPath = self.tableView.indexPathForSelectedRow() 

     if let row:Int = indexPath?.row { 


     destination.bioArray = testArray 




      } 
      } 
     } 
     } 

BIO СПИСОК VIEW CONTROLLER КЛАСС КОД:

import UIKit 

struct Note { 

var name:String 
var job:String 
} 


class BioListTableViewController: UITableViewController { 

private var notes = Array<Note>() 

var bioArray = NSArray() 
var name = String() 

var weather = NSArray() 

override func viewDidLoad() { 
    super.viewDidLoad() 

    println("THIS IS BIO ARRAY COUNT\(bioArray.count)") 
    //var weather:WeatherSummary? 
    var newItem:Note = Note(name: "", job: "") 

    for x in bioArray { 
     if let id = x["employeeName"] as? String{ 
      newItem.name = id 
     } 
    } 

    // Uncomment the following line to preserve selection between presentations 
    // self.clearsSelectionOnViewWillAppear = false 

    // Uncomment the following line to display an Edit button in the navigation bar for this view controller. 
    // self.navigationItem.rightBarButtonItem = self.editButtonItem() 
} 

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

// MARK: - Table view data source 

override func numberOfSectionsInTableView(tableView: UITableView) -> Int { 
    // #warning Potentially incomplete method implementation. 
    // Return the number of sections. 
    return 1 
} 

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    // #warning Incomplete method implementation. 
    // Return the number of rows in the section. 
    return self.bioArray.count ?? 0 
} 


override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCellWithIdentifier("bioCell", forIndexPath: indexPath) as! UITableViewCell 

    // Configure the cell... 

    // cell.textLabel?.text = "test" 

    let weatherSummary: AnyObject = bioArray[indexPath.row] 

    if let id = weatherSummary["employeeName"] as? String //Dont know the exact syntax. 
    { 
     cell.textLabel?.text = id 

    } 

    if let job = weatherSummary["jobTitle"] as? String { 
     cell.detailTextLabel?.text = job 

    } 


    return cell 
    } 

} 

UPDATE:

Это то, что возвращается из testArray.

enter image description here

+0

так что ваш второй стол находится внутри BioListTableViewController? –

+0

Да именно его в классе BioListTableViewController. – Skywalker

+1

Затем покажите код для этого. но я думаю, что есть некоторые проблемы с вашим кодом, вы делаете веб-апи-вызов внутри этого контроллера представлений, который, я думаю, вы должны сделать с другим после того, как пользователь выберет опцию .... но поделитесь своим кодом fort, что –

ответ

2

причина, почему вы не могли заставить ваши вызовы API работать с выбором ячеек просто.

Это асинхронные вызовы. Это означает, что они вернутся в какой-то момент, но не обязательно в ближайшее время. Фактически, дизайн, который у вас есть сейчас, также плох, потому что, если ваше интернет-соединение работает медленно, может потребоваться много времени, прежде чем ваш API загрузится.

Вот что вам следует делать.

В вашей BioListTableViewController создать переменную, которая будет определить, какие API должен быть вызван (возможно, стоит что делает его enum):

enum NeededAPI { 
    case Game 
    case Book 
    case Travel 
    case None 
} 

class BioListTableViewController: UITableViewController { 
    var apiThatNeedsToBeCalled:NeededAPI = .None { 
     didSet { 
      //check which API is set and call the function which will call the needed API 
     } 
    } 
var bioArray = NSArray() { 
    didSet { 
     self.tableView.reloadData() 
    } 
} 

То, что вы должны сделать сейчас, чтобы переместить API вызова логику BioListTableViewController. Когда пользователь выбирает ячейку, вы устанавливаете правильное значение для apiThatNeedsToBeCalled. Как только вы это сделаете, код внутри didSet будет выполнен, и он должен вызвать функцию, вызывающую соответствующий API.

Эта функция является асинхронной, поэтому она будет возвращаться всякий раз, когда она заканчивается. Когда он возвращается, вы установите

self.bioArray = results

который вызывает

self.tableView.reloadData() 

Очевидно, что вам нужно для вашего IBOutlettableView.

+0

Большое вам спасибо. Я чему-то научился. Еще один вопрос: сценарий переименования похож на «оператор switch», например, если игра в случае запуска этой части кода и если книга с кодом запускает этот фрагмент кода? – Skywalker

+0

Да, это самый простой способ проверить, в каком случае у вас есть. используя переключатель apiThatNeedsToBeCalled {case .Game: ..... –

+0

Если вы не возражаете, можете ли вы взглянуть на это и посмотреть, правильно ли это. Извиняюсь, я очень новичок в развитии iOS. http://pastebin.com/dVBgFxgb – Skywalker

1

IBOutlet Создайте для tableView, а затем вызвать tableView.reloadData() внутри viewWillAppear метода, и убедитесь, что tableViewdelegate и dataSource устанавливаются viewController и testArray есть некоторые объекты.

Но я видел некоторые основные проблемы в вашем коде, вы должны архивировать свой код таким образом, когда пользователь выбирает какой-либо параметр, после чего вы должны загружать данные с сервера, и было бы лучше, если вы загрузите эти данные внутри detailVC, на когда вы загружаете данные в мастер и даже перед любым взаимодействием с пользователем в методе viewDidLoad, который, как мне кажется, не прав. может быть использование никогда не выбирает какой-либо опции, и в этом случае вы потребляете пользовательские данные, вам также следует подумать об этом, а также он будет потреблять память.

Что вы должны сделать: передачи пользователя выбрать опцию detailVC т.е. BioListVC в вашем случае, а в стороне, что в методе установки или viewWillAppear fireOff загрузки данных вызова в фоновом режиме и показать кок и когда у вас есть данные, установите его массив dataSource и метод перезагрузки вызова в основном потоке.

0

Проверьте, были ли правильные данные загружены перед тем, как была нажата ваша ячейка, что означает self.testArray не nil.

EDIT: Вы можете использовать глобальную NSMutableDictionary свойство как testArray, затем сделать 3 апи вызовы, чтобы получить 3 различных ДАННЫЕ:

NSMutableDictionary *testDictionary = [NSMutableDictionary new]; 
    [testDictionary setValue:testArray1 forKey:@"books"]; 
    [testDictionary setValue:testArray2 forKey:@"travels"]; 
    [testDictionary setValue:testArray3 forKey:@"anykeys"]; 

И в вашем Segue, используйте [testDictionary valueForKey:@"books"]

+0

Я обновил свой вопрос с изображением. На изображении отображаются данные, возвращаемые testArray. Те же самые данные появляются, если я коснусь игры, путешествия или книги. На самом деле он должен показывать разные данные. Я не уверен, как создавать разные вызовы API для каждой ячейки таблицы. – Skywalker