最近NBA 2017-2018賽季的比賽日程已經(jīng)公布出來,作為一個"資深的"NBA球迷、籃球迷,怎么能不趕緊把自己喜歡的球隊給比賽日給記下來呢?之前看到過一個JRS()把日歷做成鏈接的形式可以直接把自己比賽直接寫入到手機的日歷中去又谋,受到這個啟發(fā)钝尸,干嘛不自己親自動手寫一個App,直接把賽程寫到手機日歷中去呢搂根,而且還可以鍛煉自己的編碼能力珍促。有了興趣,然后開始動手剩愧,一切就水到渠成了猪叙。下面就簡單記錄一下這個小App的制作過程。
1仁卷、確定需求
- 球隊列表穴翩,能夠選擇自己喜歡的NBA球隊。
①按照正常的NBA聯(lián)盟分區(qū)锦积,分為東部球隊以及西部球隊
②每個球隊展示的信息有名稱芒帕、Logo、所在分區(qū) - 球隊賽程列表
①每場比賽展示主場丰介、客場球隊的信息以及比賽的北京日期背蟆、比賽地點等
②提供導(dǎo)入日歷按鈕,點擊后將當前展示球隊的賽程導(dǎo)入到蘋果手機的日歷中
2哮幢、分析需求带膀、確定數(shù)據(jù)來源(接口API)
通過分析上面的需求,可以得出主要有兩個頁面橙垢,球隊列表頁面和球隊比賽賽程列表頁面垛叨。通過查找數(shù)據(jù)得出需要下面三個接口:
經(jīng)過測試這些接口已經(jīng)再次確認需求,確認這些接口完全能夠滿足開發(fā)需要柜某。
3嗽元、動手開發(fā),寫Code
1. 開發(fā)球隊列表頁面
當前頁面是一個列表頁面喂击,實現(xiàn)方式為一個tableView的group形式剂癌。
①定義模型Team,包含名稱惭等、代號珍手、城市办铡、分區(qū)辞做、聯(lián)盟分區(qū)、聯(lián)盟分區(qū)顯示字段寡具、球隊logo等字段
class Team: Mappable {
var name:String? //名稱
var code:String? //代號
var city:String? //日期
var division:String? //分區(qū)
var conference:String? //聯(lián)盟分區(qū)
var displayConference:String? //聯(lián)盟分區(qū)顯示
var imageUrl:String? //球隊圖片
required init?(map: Map) {
}
func mapping(map: Map) {
name <- map["name"]
code <- map["code"]
city <- map["city"]
division <- map["division"]
conference <- map["conference"]
displayConference <- map["displayConference"]
}
}
②自定義Cell,展示Demo tableView
③通過上面的獲取球隊列表的接口秤茅,使用Alamofire拿到球隊列表數(shù)據(jù),使用SwiftJson童叠、ObjectMapper將返回的結(jié)果轉(zhuǎn)化為Team模型數(shù)組框喳。注意以為獲取到的球隊數(shù)據(jù)中不包含球隊Logo Url,可以通過自定義的Json文件team_logo.json來進行配置课幕,然后通過獲取球隊Logo的接口獲取到對于的球隊Logo 的url。
Alamofire.request("http://china.nba.com/static/data/league/conferenceteamlist.json").responseJSON { (response) in
let result = JSON(response.result.value as Any)
// print(result)
let listGroups = result["payload"]["listGroups"].arrayValue
for teams in listGroups{
var tempArray = [Team]()
for teamJson in teams["teams"].arrayValue{
// print(teamJson["profile"].rawString()!)
let team = Team(JSONString: teamJson["profile"].rawString()!)
tempArray.append(team!)
}
self.teamsData.append(tempArray)
}
self.tableView.reloadData()
}
④展示球隊列表數(shù)據(jù)五垮,完善細節(jié)乍惊。
搞定!
2. 開發(fā)球隊賽程列表頁面
當前頁面是一個列表頁面放仗,實現(xiàn)方式為一個tableView的plain形式润绎。實現(xiàn)方式類似上面的球隊列表頁面。
①定義模型Game诞挨,包含日期莉撇、比賽地址、主場城市惶傻、主場球隊棍郎、客場球隊、客場城市
②自定義Cell,展示Demo tableView
③通過上面的獲取球隊賽程列表的接口银室,使用Alamofire拿到球隊列表數(shù)據(jù)涂佃,使用SwiftJson、ObjectMapper將返回的結(jié)果轉(zhuǎn)化為Game模型數(shù)組蜈敢。
④展示球隊賽程列表巡李,完善細節(jié)拗军。
3. 導(dǎo)入比賽到手機日歷中
點擊導(dǎo)入日歷按鈕饵蒂,確定后開始執(zhí)行導(dǎo)入日歷功能
這就要用到iOS提供的EventKit框架來實現(xiàn)將比賽寫入到日歷的功能了。
首先要去獲取授權(quán)赠幕,沒有被授權(quán)的話是不能使用EventKit框架的辐宾,iOS自身框架大部分都有這個限制狱从。而且在iOS 10以上的系統(tǒng)還要添加訪問calendar的隱私說明,否則會引起崩潰叠纹。
lazy var eventStore = EKEventStore()
// 獲取訪問日歷的權(quán)限
self.eventStore .requestAccess(to: .event, completion: { (granted, error) in
//授權(quán)過可以訪問日歷
if granted{
let tempArray = self.eventStore.calendars(for: .event)
var inserted = false
for calendar in tempArray{
print(calendar)
//判斷是否已經(jīng)導(dǎo)入了比賽內(nèi)容
if calendar.title == self.team.name {
inserted = true
}
}
if !inserted {
self.saveEvent()
}else{
DispatchQueue.main.async {
CDAlertView(title: "", message: "已經(jīng)導(dǎo)入過該隊比賽!", type: .notification).show()
}
}
}
})
接下來就可以執(zhí)行導(dǎo)入時間到日歷的功能了季研。
self.startAnimating(CGSize(width: 30, height: 30),type:.ballBeat,color: UIColor.init(hexString: "#E0486C"),backgroundColor:UIColor.white)
// 因為是讀寫操作,比較耗時誉察,需要放到后臺去執(zhí)行与涡。
DispatchQueue.global().async {
//把比賽寫入日歷
// print(self.eventStore)
for game in self.datas{
let event = EKEvent(eventStore: self.eventStore)
// 標題
let title = game.homeTeamName! + "VS" + game.awayTeamName!
event.title = title
//時間
let date = Date.init(timeIntervalSince1970: TimeInterval(Int64(game.gameDate!)!/1000))
//開始時間、結(jié)束時間
event.startDate = date
event.endDate = date.addingTimeInterval(150*60)
//日歷
let calendar = self.eventStore.defaultCalendarForNewEvents
calendar.title = self.team.name! + "賽程"
calendar.cgColor = UIColor.purple.cgColor
event.calendar = calendar
do{
try self.eventStore.save(event, span: EKSpan.thisEvent)
}catch let error as NSError{
print(error)
}
}
//結(jié)束后持偏,主線程刷新UI
DispatchQueue.main.async {
self.stopAnimating()
}
執(zhí)行完去查看日歷驼卖,就能夠看到賽程已經(jīng)寫入到日歷啦,再也不用擔(dān)心忘了比賽了鸿秆。在上面寫入賽程的Event酌畜,還可以添加多長時間進行提醒的功能。是不是很方便卿叽,很簡單桥胞?
項目雖然簡單恳守,但是通過代碼的方式來解決問題不就是程序猿應(yīng)該做得,而且通過這些小項目也能學(xué)到一些東西贩虾,鍛煉自己的編碼能力催烘。
項目地址:點我,歡迎各位大神前來指導(dǎo)缎罢。