转自我的github: https://github.com/uniquejava/AlamofireSwiftyJSONDemo
Alamofire | SwiftyJSON Demo
My swift3 exercise for this excellent tutorial with some of my own changes.
Setup CocoaPods
➜ sudo gem update --system ➜ sudo gem install cocoapods ➜ pod setup ➜ (Xcode8 create single view application) ➜ cd AlamofireSwiftyJSONDemo ➜ pod init ➜ open -a Xcode Podfile ➜ Make some changes here,see below ➜ pod install Analyzing dependencies Downloading dependencies Installing Alamofire (4.0.1) Installing SwiftyJSON (3.1.1) Generating Pods project Integrating client project [!] Please close any current Xcode sessions and use `AlamofireSwiftyJSONDemo.xcworkspace` for this project from now on. Sending stats Pod installation complete! There are 2 dependencies from the Podfile and 2 total pods installed. ➜
Podfile: Before modification(pod init)
# Uncomment the next line to define a global platform for your project # platform :ios,'9.0' target 'AlamofireSwiftyJSONDemo' do # Comment the next line if you're not using Swift and don't want to use dynamic frameworks use_frameworks! # Pods for AlamofireSwiftyJSONDemo end
Podfile (after)
# Uncomment the next line to define a global platform for your project platform :ios,'10.0' target 'AlamofireSwiftyJSONDemo' do # Comment the next line if you're not using Swift and don't want to use dynamic frameworks use_frameworks! # Pods for AlamofireSwiftyJSONDemo pod 'Alamofire' pod 'SwiftyJSON' end
Implement this App
- From storyboard,drag a table view into the generated view controller
- Resize it and add missing constraints
- Set cell type to be
subtitle
- Give cell a reusable identifier
ContactCell
- Ctrl drag this table view to ViewController.swift and bind a var for it
- Meanwhile set ViewController as its
datasource
anddelegate
- Implement the 2 required datasource methods
- Embed the controller into a navigation controller.
- Add a title for this view controller
- Select this view controller,uncheck the 2 options under
Attribute Inspector - Extend Edges
,otherwise there will be some blank area above the table view. - Change Info.plist add
App Transport Security Settings - Allow Arbitrary Loads: Yes
,otherwise you won't be able to issue any http request.
Code
@IBOutlet weak var contactsTableView: UITableView! var contacts = [[String: AnyObject]]() // Array of dictionary override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view,typically from a nib. Alamofire.request("http://api.androidhive.info/contacts/").responseJSON { (res) in guard let resultValue = res.result.value else { return } let swiftyJsonVar = JSON(resultValue) if let resData = swiftyJsonVar["contacts"].arrayObject { self.contacts = resData as! [[String: AnyObject]] } if self.contacts.count > 0 { self.contactsTableView.reloadData() } } } func tableView(_ tableView: UITableView,numberOfRowsInSection section: Int) -> Int { return contacts.count } func tableView(_ tableView: UITableView,cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "ContactCell",for: indexPath) let contact = contacts[indexPath.row] cell.textLabel?.text = contact["name"] as? String cell.detailTextLabel?.text = contact["email"] as? String return cell }