├── .gitignore ├── .gitmodules ├── LICENSE ├── README.md ├── SegmentFault.xcodeproj └── project.pbxproj └── SegmentFault ├── DataCenters ├── SFQuestion.h └── SFQuestion.m ├── Delegates ├── SFAppDelegate.h └── SFAppDelegate.m ├── Resource ├── AnswerDetail.html.txt ├── AnswerDetail.js.txt ├── GetQuestionAnswer.js.txt ├── GetQuestionDetail.js.txt └── QuestionDetail.html.txt ├── SegmentFault-Info.plist ├── SegmentFault-Prefix.pch ├── Services ├── SFLoginService.h ├── SFLoginService.m ├── SFQuestionService.h └── SFQuestionService.m ├── Tools ├── SFMessager.h ├── SFMessager.m ├── SFTools.h └── SFTools.m ├── ViewControllers ├── Base │ ├── SFRootViewController.h │ ├── SFRootViewController.m │ ├── SFWebViewController.h │ └── SFWebViewController.m ├── Nav │ ├── SFSlideNavViewController.h │ └── SFSlideNavViewController.m ├── SFLoginViewController.h ├── SFLoginViewController.m ├── SFQuestionDetailViewController.h ├── SFQuestionDetailViewController.m ├── SFQuestionListViewController.h └── SFQuestionListViewController.m ├── Views ├── Cells │ ├── SFQuestionListCell.h │ └── SFQuestionListCell.m ├── SFLabel.h ├── SFLabel.m ├── SFLocalWebView.h └── SFLocalWebView.m ├── en.lproj └── InfoPlist.strings ├── images ├── Default-568h@2x.png ├── Default.png ├── Default@2x.png ├── icons │ ├── Icon-72.png │ ├── Icon-Small-50.png │ ├── Icon-Small.png │ ├── Icon-Small@2x.png │ ├── Icon.png │ ├── Icon@2x.png │ └── iTunesArtwork.png ├── logout │ ├── logout_btn.png │ ├── logout_btn@2x.png │ ├── logout_btn_pressed.png │ └── logout_btn_pressed@2x.png ├── nav │ ├── back_button_background.png │ ├── back_button_background@2x.png │ ├── back_button_pressed_background.png │ ├── back_button_pressed_background@2x.png │ ├── navigationbar_light_background.png │ ├── navigationbar_light_background@2x.png │ ├── slide_navigator_button.png │ ├── slide_navigator_button@2x.png │ ├── slide_navigator_button_pressed.png │ ├── slide_navigator_button_pressed@2x.png │ ├── slide_navigator_cell_background.png │ ├── slide_navigator_cell_background@2x.png │ ├── slide_navigator_cell_chevron.png │ ├── slide_navigator_cell_chevron@2x.png │ ├── slide_navigator_cell_selected_background.png │ ├── slide_navigator_cell_selected_background@2x.png │ ├── slide_navigator_cell_selected_chevron.png │ ├── slide_navigator_cell_selected_chevron@2x.png │ ├── slide_navigator_dark_backgrond.png │ ├── slide_navigator_dark_backgrond@2x.png │ ├── slide_navigator_light_backgrond.png │ ├── slide_navigator_light_backgrond@2x.png │ ├── slide_navigator_section_header_background.png │ └── slide_navigator_section_header_background@2x.png ├── questiondetail │ ├── question_detail_section_header_background.png │ └── question_detail_section_header_background@2x.png └── questionlist │ ├── qlist_cell_pop.png │ ├── qlist_cell_pop@2x.png │ ├── qlist_cell_pop_unanswered.png │ ├── qlist_cell_pop_unanswered@2x.png │ ├── qlist_cell_selected_background.png │ └── qlist_cell_selected_background@2x.png ├── imagesV2 ├── nav │ ├── nav_back.png │ ├── nav_back@2x.png │ ├── nav_bar_bg.png │ ├── nav_bar_bg@2x.png │ ├── nav_cell_arrow.png │ ├── nav_cell_arrow@2x.png │ ├── nav_cell_arrow_active.png │ ├── nav_cell_arrow_active@2x.png │ ├── nav_cell_bg.png │ ├── nav_cell_bg@2x.png │ ├── nav_cell_bg_active.png │ ├── nav_cell_bg_active@2x.png │ ├── nav_menu.png │ └── nav_menu@2x.png ├── questiondetail │ ├── question_list_header_bg.png │ └── question_list_header_bg@2x.png └── questionlist │ ├── question_list_cell_sep.png │ ├── question_list_cell_sep@2x.png │ ├── question_list_vote.png │ └── question_list_vote@2x.png └── main.m /.gitignore: -------------------------------------------------------------------------------- 1 | build 2 | *xcodeproj/*mode* 3 | *xcodeproj/*pbxuser 4 | *xcodeproj/*per* 5 | *xcodeproj/project.xcworkspace 6 | *xcodeproj/xcuserdata 7 | *tmproj 8 | .DS_Store 9 | profile 10 | *.pbxuser 11 | *.mode1v3 12 | External/GHUnit/* 13 | *.swp 14 | *.swo 15 | *.xcuserstate 16 | -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "SegmentFault/Support/SlimeRefresh"] 2 | path = SegmentFault/Support/SlimeRefresh 3 | url = https://github.com/dbsGen/SlimeRefresh.git 4 | [submodule "SegmentFault/Support/AFNetworking"] 5 | path = SegmentFault/Support/AFNetworking 6 | url = https://github.com/AFNetworking/AFNetworking.git 7 | [submodule "SegmentFault/Support/Kache"] 8 | path = SegmentFault/Support/Kache 9 | url = https://github.com/gaosboy/kache.git 10 | [submodule "SegmentFault/Support/URLManager"] 11 | path = SegmentFault/Support/URLManager 12 | url = https://github.com/gaosboy/urlmanager.git 13 | [submodule "SegmentFault/Support/JSONKit"] 14 | path = SegmentFault/Support/JSONKit 15 | url = https://github.com/johnezang/JSONKit.git 16 | [submodule "SegmentFault/Support/GTM"] 17 | path = SegmentFault/Support/GTM 18 | url = git://github.com/innerfence/google-toolbox-for-mac.git 19 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) <2013> 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in 13 | all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | THE SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | SegmentFault 2 | ============= 3 | 4 | SegmentFault为开发者提供高效的解决问题平台,网址是:http://segmentfault.com/ 或 http://sf.gg/。 5 | 这个工程是SegmentFault的iOS客户端,完全开源。 6 | 架构不断进化ing 7 | 8 | 特点 9 | ============= 10 | 11 | SF iOS App使用URLManager,通过URL Scheme的方式管理ViewController,做到VC松耦合,不依赖。 12 | 使用Kache作为缓存控件,用来缓存网络数据。 13 | 以上两个控件是该项目自主研发,旨在打造轻量、好用的iOS开发控件。 14 | 15 | 开发 16 | ============= 17 | 这个工程使用Submodule管理所有第三方控件。目录结构如下: 18 | 19 | ####[iOSSF](https://github.com/gaosboy/iOSSF)/SegmentFault/Support/ 20 | #####|__ [AFNetworking](https://github.com/AFNetworking/AFNetworking) 21 | #####|__ [JSONKit](https://github.com/johnezang/JSONKit) 22 | #####|__ [Kache](https://github.com/gaosboy/kache) (自主开发的缓存控件) 23 | #####|__ [SlimeRefresh](https://github.com/dbsGen/SlimeRefresh) 24 | #####|__ [URLManager](https://github.com/gaosboy/urlmanager) (自主开发的NavigationViewController,用URL Scheme管理ViewControllers) 25 | 26 | 建议你使用[SourceTree](http://itun.es/cn/rFBIy.m)来管理工程。使用SourceTree Clone一个工程会自动加载Submodule。 27 | 28 | 如果你使用命令行Clone工程,请运行如下命令,加载Submodule 29 | 30 | ### # git clone https://github.com/gaosboy/iOSSF.git 31 | ``` 32 | Cloning into 'iOSSF'... 33 | remote: Counting objects: 519, done. 34 | remote: Compressing objects: 100% (376/376), done. 35 | remote: Total 519 (delta 272), reused 367 (delta 120) 36 | Receiving objects: 100% (519/519), 364.74 KiB | 180 KiB/s, done. 37 | Resolving deltas: 100% (272/272), done. 38 | ``` 39 | 40 | ### # cd iOSSF 41 | 42 | ### # git submodule init 43 | ``` 44 | Submodule 'SegmentFault/Support/AFNetworking' (https://github.com/AFNetworking/AFNetworking.git) registered for path 'SegmentFault/Support/AFNetworking' 45 | Submodule 'SegmentFault/Support/JSONKit' (https://github.com/johnezang/JSONKit.git) registered for path 'SegmentFault/Support/JSONKit' 46 | Submodule 'SegmentFault/Support/Kache' (https://github.com/gaosboy/kache.git) registered for path 'SegmentFault/Support/Kache' 47 | Submodule 'SegmentFault/Support/SlimeRefresh' (https://github.com/dbsGen/SlimeRefresh.git) registered for path 'SegmentFault/Support/SlimeRefresh' 48 | Submodule 'SegmentFault/Support/URLManager' (https://github.com/gaosboy/urlmanager.git) registered for path 'SegmentFault/Support/URLManager' 49 | ``` 50 | ### # git submodule update 51 | ``` 52 | Cloning into 'SegmentFault/Support/AFNetworking'... 53 | remote: Counting objects: 4796, done. 54 | remote: Compressing objects: 100% (1613/1613), done. 55 | remote: Total 4796 (delta 3278), reused 4541 (delta 3149) 56 | Receiving objects: 100% (4796/4796), 1.34 MiB | 12 KiB/s, done. 57 | Resolving deltas: 100% (3278/3278), done. 58 | Submodule path 'SegmentFault/Support/AFNetworking': checked out 'a146a3bf66aa2b6bfee1f38fe24f5d3cd37de65a' 59 | Cloning into 'SegmentFault/Support/JSONKit'... 60 | remote: Counting objects: 263, done. 61 | remote: Compressing objects: 100% (147/147), done. 62 | remote: Total 263 (delta 123), reused 244 (delta 114) 63 | Receiving objects: 100% (263/263), 160.79 KiB | 13 KiB/s, done. 64 | Resolving deltas: 100% (123/123), done. 65 | Submodule path 'SegmentFault/Support/JSONKit': checked out '82157634ca0ca5b6a4a67a194dd11f15d9b72835' 66 | Cloning into 'SegmentFault/Support/Kache'... 67 | remote: Counting objects: 39, done. 68 | remote: Compressing objects: 100% (30/30), done. 69 | remote: Total 39 (delta 7), reused 32 (delta 6) 70 | Unpacking objects: 100% (39/39), done. 71 | Submodule path 'SegmentFault/Support/Kache': checked out '926b791ca2c6832070c64632acb92ce76ddd8fc8' 72 | Cloning into 'SegmentFault/Support/SlimeRefresh'... 73 | remote: Counting objects: 541, done. 74 | remote: Compressing objects: 100% (325/325), done. 75 | remote: Total 541 (delta 245), reused 506 (delta 210) 76 | Receiving objects: 100% (541/541), 394.46 KiB | 9 KiB/s, done. 77 | Resolving deltas: 100% (245/245), done. 78 | Submodule path 'SegmentFault/Support/SlimeRefresh': checked out '7b51e1b88551d2a9eb4cea6f4003cf3511091871' 79 | Cloning into 'SegmentFault/Support/URLManager'... 80 | remote: Counting objects: 69, done. 81 | remote: Compressing objects: 100% (49/49), done. 82 | remote: Total 69 (delta 28), reused 51 (delta 16) 83 | Unpacking objects: 100% (69/69), done. 84 | Submodule path 'SegmentFault/Support/URLManager': checked out '64319dd7c6f3e26917981025cc0088bd87d9bf9d' 85 | ``` 86 | -------------------------------------------------------------------------------- /SegmentFault.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 453D55A9172CFAF9000C5533 /* GTMNSString+HTML.m in Sources */ = {isa = PBXBuildFile; fileRef = 453D55A8172CFAF9000C5533 /* GTMNSString+HTML.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; 11 | D70DF7B7168805D300AD1207 /* JSONKit.m in Sources */ = {isa = PBXBuildFile; fileRef = D70DF7B4168805D300AD1207 /* JSONKit.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; 12 | D70DF7CC1688389C00AD1207 /* logout_btn.png in Resources */ = {isa = PBXBuildFile; fileRef = D70DF7C81688389C00AD1207 /* logout_btn.png */; }; 13 | D70DF7CD1688389C00AD1207 /* logout_btn@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = D70DF7C91688389C00AD1207 /* logout_btn@2x.png */; }; 14 | D70DF7CE1688389C00AD1207 /* logout_btn_pressed.png in Resources */ = {isa = PBXBuildFile; fileRef = D70DF7CA1688389C00AD1207 /* logout_btn_pressed.png */; }; 15 | D70DF7CF1688389C00AD1207 /* logout_btn_pressed@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = D70DF7CB1688389C00AD1207 /* logout_btn_pressed@2x.png */; }; 16 | D70DF81816883CAA00AD1207 /* goBackItem.png in Resources */ = {isa = PBXBuildFile; fileRef = D70DF80A16883CAA00AD1207 /* goBackItem.png */; }; 17 | D70DF81916883CAA00AD1207 /* goBackItem@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = D70DF80B16883CAA00AD1207 /* goBackItem@2x.png */; }; 18 | D70DF81A16883CAA00AD1207 /* goForwardItem.png in Resources */ = {isa = PBXBuildFile; fileRef = D70DF80C16883CAA00AD1207 /* goForwardItem.png */; }; 19 | D70DF81B16883CAA00AD1207 /* goForwardItem@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = D70DF80D16883CAA00AD1207 /* goForwardItem@2x.png */; }; 20 | D70DF81C16883CAA00AD1207 /* UMNavigationController.m in Sources */ = {isa = PBXBuildFile; fileRef = D70DF80F16883CAA00AD1207 /* UMNavigationController.m */; }; 21 | D70DF81D16883CAA00AD1207 /* UMSlideNavigationController.m in Sources */ = {isa = PBXBuildFile; fileRef = D70DF81116883CAA00AD1207 /* UMSlideNavigationController.m */; }; 22 | D70DF81E16883CAA00AD1207 /* UMTools.m in Sources */ = {isa = PBXBuildFile; fileRef = D70DF81316883CAA00AD1207 /* UMTools.m */; }; 23 | D70DF81F16883CAA00AD1207 /* UMViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = D70DF81516883CAA00AD1207 /* UMViewController.m */; }; 24 | D70DF82016883CAA00AD1207 /* UMWebViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = D70DF81716883CAA00AD1207 /* UMWebViewController.m */; }; 25 | D71B378A16E496CC00E7F87C /* question_list_vote.png in Resources */ = {isa = PBXBuildFile; fileRef = D71B378816E496CC00E7F87C /* question_list_vote.png */; }; 26 | D71B378B16E496CC00E7F87C /* question_list_vote@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = D71B378916E496CC00E7F87C /* question_list_vote@2x.png */; }; 27 | D71B4CD316E5C984007484B7 /* question_list_header_bg.png in Resources */ = {isa = PBXBuildFile; fileRef = D71B4CD116E5C984007484B7 /* question_list_header_bg.png */; }; 28 | D71B4CD416E5C984007484B7 /* question_list_header_bg@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = D71B4CD216E5C984007484B7 /* question_list_header_bg@2x.png */; }; 29 | D7627873169FCA95007E73B2 /* QuestionDetail.html.txt in Resources */ = {isa = PBXBuildFile; fileRef = D7627872169FCA95007E73B2 /* QuestionDetail.html.txt */; }; 30 | D7734D5D1684B7AB000170FC /* sr_refresh.png in Resources */ = {isa = PBXBuildFile; fileRef = D7734D561684B7AB000170FC /* sr_refresh.png */; }; 31 | D7734D5E1684B7AB000170FC /* sr_refresh@2X.png in Resources */ = {isa = PBXBuildFile; fileRef = D7734D571684B7AB000170FC /* sr_refresh@2X.png */; }; 32 | D7734D5F1684B7AB000170FC /* SRRefreshView.m in Sources */ = {isa = PBXBuildFile; fileRef = D7734D5A1684B7AB000170FC /* SRRefreshView.m */; }; 33 | D7734D601684B7AB000170FC /* SRSlimeView.m in Sources */ = {isa = PBXBuildFile; fileRef = D7734D5C1684B7AB000170FC /* SRSlimeView.m */; }; 34 | D7734D751684BE93000170FC /* AFHTTPClient.m in Sources */ = {isa = PBXBuildFile; fileRef = D7734D631684BE93000170FC /* AFHTTPClient.m */; }; 35 | D7734D761684BE93000170FC /* AFHTTPRequestOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = D7734D651684BE93000170FC /* AFHTTPRequestOperation.m */; }; 36 | D7734D771684BE93000170FC /* AFImageRequestOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = D7734D671684BE93000170FC /* AFImageRequestOperation.m */; }; 37 | D7734D781684BE93000170FC /* AFJSONRequestOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = D7734D691684BE93000170FC /* AFJSONRequestOperation.m */; }; 38 | D7734D791684BE93000170FC /* AFNetworkActivityIndicatorManager.m in Sources */ = {isa = PBXBuildFile; fileRef = D7734D6B1684BE93000170FC /* AFNetworkActivityIndicatorManager.m */; }; 39 | D7734D7A1684BE93000170FC /* AFPropertyListRequestOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = D7734D6E1684BE93000170FC /* AFPropertyListRequestOperation.m */; }; 40 | D7734D7B1684BE93000170FC /* AFURLConnectionOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = D7734D701684BE93000170FC /* AFURLConnectionOperation.m */; }; 41 | D7734D7C1684BE93000170FC /* AFXMLRequestOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = D7734D721684BE93000170FC /* AFXMLRequestOperation.m */; }; 42 | D7734D7D1684BE93000170FC /* UIImageView+AFNetworking.m in Sources */ = {isa = PBXBuildFile; fileRef = D7734D741684BE93000170FC /* UIImageView+AFNetworking.m */; }; 43 | D779BF8D16E6F5D600771ECE /* question_list_cell_sep.png in Resources */ = {isa = PBXBuildFile; fileRef = D779BF8B16E6F5D600771ECE /* question_list_cell_sep.png */; }; 44 | D779BF8E16E6F5D600771ECE /* question_list_cell_sep@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = D779BF8C16E6F5D600771ECE /* question_list_cell_sep@2x.png */; }; 45 | D77CE21B16611B8B00F1BC9E /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D77CE21A16611B8B00F1BC9E /* UIKit.framework */; }; 46 | D77CE21D16611B8B00F1BC9E /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D77CE21C16611B8B00F1BC9E /* Foundation.framework */; }; 47 | D77CE21F16611B8B00F1BC9E /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D77CE21E16611B8B00F1BC9E /* CoreGraphics.framework */; }; 48 | D77CE22516611B8B00F1BC9E /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = D77CE22316611B8B00F1BC9E /* InfoPlist.strings */; }; 49 | D77CE22716611B8B00F1BC9E /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = D77CE22616611B8B00F1BC9E /* main.m */; }; 50 | D78452BB16E0698100FFBAB9 /* SFLabel.m in Sources */ = {isa = PBXBuildFile; fileRef = D78452BA16E0698100FFBAB9 /* SFLabel.m */; }; 51 | D79826CC1663A33900054585 /* CFNetwork.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D79826CB1663A33900054585 /* CFNetwork.framework */; }; 52 | D79826CE1663A37400054585 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D79826CD1663A37400054585 /* SystemConfiguration.framework */; }; 53 | D79826D01663A37C00054585 /* MobileCoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D79826CF1663A37C00054585 /* MobileCoreServices.framework */; }; 54 | D79826D21663A38400054585 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D79826D11663A38400054585 /* QuartzCore.framework */; }; 55 | D79826D41663A3A500054585 /* libz.1.2.5.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = D79826D31663A3A500054585 /* libz.1.2.5.dylib */; }; 56 | D79D2E8C16A2DF2B00BC74DC /* SFQuestion.m in Sources */ = {isa = PBXBuildFile; fileRef = D79D2E6D16A2DF2B00BC74DC /* SFQuestion.m */; }; 57 | D79D2E8D16A2DF2B00BC74DC /* SFAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = D79D2E7016A2DF2B00BC74DC /* SFAppDelegate.m */; }; 58 | D79D2E8E16A2DF2B00BC74DC /* SFLoginService.m in Sources */ = {isa = PBXBuildFile; fileRef = D79D2E7316A2DF2B00BC74DC /* SFLoginService.m */; }; 59 | D79D2E8F16A2DF2B00BC74DC /* SFQuestionService.m in Sources */ = {isa = PBXBuildFile; fileRef = D79D2E7516A2DF2B00BC74DC /* SFQuestionService.m */; }; 60 | D79D2E9016A2DF2B00BC74DC /* SFTools.m in Sources */ = {isa = PBXBuildFile; fileRef = D79D2E7816A2DF2B00BC74DC /* SFTools.m */; }; 61 | D79D2E9116A2DF2B00BC74DC /* SFRootViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = D79D2E7C16A2DF2B00BC74DC /* SFRootViewController.m */; }; 62 | D79D2E9216A2DF2B00BC74DC /* SFWebViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = D79D2E7E16A2DF2B00BC74DC /* SFWebViewController.m */; }; 63 | D79D2E9316A2DF2B00BC74DC /* SFLoginViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = D79D2E8016A2DF2B00BC74DC /* SFLoginViewController.m */; }; 64 | D79D2E9416A2DF2B00BC74DC /* SFQuestionDetailViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = D79D2E8216A2DF2B00BC74DC /* SFQuestionDetailViewController.m */; }; 65 | D79D2E9516A2DF2B00BC74DC /* SFQuestionListViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = D79D2E8416A2DF2B00BC74DC /* SFQuestionListViewController.m */; }; 66 | D79D2E9716A2DF2B00BC74DC /* SFLocalWebView.m in Sources */ = {isa = PBXBuildFile; fileRef = D79D2E8916A2DF2B00BC74DC /* SFLocalWebView.m */; }; 67 | D79D2E9C16A2E07800BC74DC /* SFSlideNavViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = D79D2E9B16A2E07800BC74DC /* SFSlideNavViewController.m */; }; 68 | D79D2E9F16A2F78B00BC74DC /* SFMessager.m in Sources */ = {isa = PBXBuildFile; fileRef = D79D2E9E16A2F78B00BC74DC /* SFMessager.m */; }; 69 | D7A9868316845EE200AB9A61 /* qlist_cell_pop.png in Resources */ = {isa = PBXBuildFile; fileRef = D7A9867D16845EE200AB9A61 /* qlist_cell_pop.png */; }; 70 | D7A9868416845EE200AB9A61 /* qlist_cell_pop@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = D7A9867E16845EE200AB9A61 /* qlist_cell_pop@2x.png */; }; 71 | D7A9868516845EE200AB9A61 /* qlist_cell_pop_unanswered.png in Resources */ = {isa = PBXBuildFile; fileRef = D7A9867F16845EE200AB9A61 /* qlist_cell_pop_unanswered.png */; }; 72 | D7A9868616845EE200AB9A61 /* qlist_cell_pop_unanswered@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = D7A9868016845EE200AB9A61 /* qlist_cell_pop_unanswered@2x.png */; }; 73 | D7A9868716845EE200AB9A61 /* qlist_cell_selected_background.png in Resources */ = {isa = PBXBuildFile; fileRef = D7A9868116845EE200AB9A61 /* qlist_cell_selected_background.png */; }; 74 | D7A9868816845EE200AB9A61 /* qlist_cell_selected_background@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = D7A9868216845EE200AB9A61 /* qlist_cell_selected_background@2x.png */; }; 75 | D7B217C01685CC3B001269EB /* Kache.m in Sources */ = {isa = PBXBuildFile; fileRef = D7B217B31685CC3B001269EB /* Kache.m */; }; 76 | D7B217C11685CC3B001269EB /* KHolder.m in Sources */ = {isa = PBXBuildFile; fileRef = D7B217B71685CC3B001269EB /* KHolder.m */; }; 77 | D7B217C21685CC3B001269EB /* KObject.m in Sources */ = {isa = PBXBuildFile; fileRef = D7B217B91685CC3B001269EB /* KObject.m */; }; 78 | D7B217C31685CC3B001269EB /* KPool.m in Sources */ = {isa = PBXBuildFile; fileRef = D7B217BB1685CC3B001269EB /* KPool.m */; }; 79 | D7B217C41685CC3B001269EB /* KQueue.m in Sources */ = {isa = PBXBuildFile; fileRef = D7B217BD1685CC3B001269EB /* KQueue.m */; }; 80 | D7B217C51685CC3B001269EB /* KUtil.m in Sources */ = {isa = PBXBuildFile; fileRef = D7B217BF1685CC3B001269EB /* KUtil.m */; }; 81 | D7C09C6C166323090066EAF5 /* Default-568h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = D7C09C69166323090066EAF5 /* Default-568h@2x.png */; }; 82 | D7C09C6D166323090066EAF5 /* Default.png in Resources */ = {isa = PBXBuildFile; fileRef = D7C09C6A166323090066EAF5 /* Default.png */; }; 83 | D7C09C6E166323090066EAF5 /* Default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = D7C09C6B166323090066EAF5 /* Default@2x.png */; }; 84 | D7D408831687253D00C5C256 /* AnswerDetail.js.txt in Resources */ = {isa = PBXBuildFile; fileRef = D7D408821687253D00C5C256 /* AnswerDetail.js.txt */; }; 85 | D7D4F32516635B5B003B43EE /* Icon-72.png in Resources */ = {isa = PBXBuildFile; fileRef = D7D4F31E16635B5B003B43EE /* Icon-72.png */; }; 86 | D7D4F32616635B5B003B43EE /* Icon-Small-50.png in Resources */ = {isa = PBXBuildFile; fileRef = D7D4F31F16635B5B003B43EE /* Icon-Small-50.png */; }; 87 | D7D4F32716635B5B003B43EE /* Icon-Small.png in Resources */ = {isa = PBXBuildFile; fileRef = D7D4F32016635B5B003B43EE /* Icon-Small.png */; }; 88 | D7D4F32816635B5B003B43EE /* Icon-Small@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = D7D4F32116635B5B003B43EE /* Icon-Small@2x.png */; }; 89 | D7D4F32916635B5B003B43EE /* Icon.png in Resources */ = {isa = PBXBuildFile; fileRef = D7D4F32216635B5B003B43EE /* Icon.png */; }; 90 | D7D4F32A16635B5B003B43EE /* Icon@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = D7D4F32316635B5B003B43EE /* Icon@2x.png */; }; 91 | D7D4F32B16635B5B003B43EE /* iTunesArtwork.png in Resources */ = {isa = PBXBuildFile; fileRef = D7D4F32416635B5B003B43EE /* iTunesArtwork.png */; }; 92 | D7D5D95C16DF7F5B00C25B65 /* nav_cell_arrow_active.png in Resources */ = {isa = PBXBuildFile; fileRef = D7D5D95216DF7F5B00C25B65 /* nav_cell_arrow_active.png */; }; 93 | D7D5D95D16DF7F5B00C25B65 /* nav_cell_arrow_active@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = D7D5D95316DF7F5B00C25B65 /* nav_cell_arrow_active@2x.png */; }; 94 | D7D5D95E16DF7F5B00C25B65 /* nav_cell_arrow.png in Resources */ = {isa = PBXBuildFile; fileRef = D7D5D95416DF7F5B00C25B65 /* nav_cell_arrow.png */; }; 95 | D7D5D95F16DF7F5B00C25B65 /* nav_cell_arrow@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = D7D5D95516DF7F5B00C25B65 /* nav_cell_arrow@2x.png */; }; 96 | D7D5D96016DF7F5B00C25B65 /* nav_cell_bg_active.png in Resources */ = {isa = PBXBuildFile; fileRef = D7D5D95616DF7F5B00C25B65 /* nav_cell_bg_active.png */; }; 97 | D7D5D96116DF7F5B00C25B65 /* nav_cell_bg_active@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = D7D5D95716DF7F5B00C25B65 /* nav_cell_bg_active@2x.png */; }; 98 | D7D5D96216DF7F5B00C25B65 /* nav_cell_bg.png in Resources */ = {isa = PBXBuildFile; fileRef = D7D5D95816DF7F5B00C25B65 /* nav_cell_bg.png */; }; 99 | D7D5D96316DF7F5B00C25B65 /* nav_cell_bg@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = D7D5D95916DF7F5B00C25B65 /* nav_cell_bg@2x.png */; }; 100 | D7D5D96416DF7F5B00C25B65 /* nav_menu.png in Resources */ = {isa = PBXBuildFile; fileRef = D7D5D95A16DF7F5B00C25B65 /* nav_menu.png */; }; 101 | D7D5D96516DF7F5B00C25B65 /* nav_menu@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = D7D5D95B16DF7F5B00C25B65 /* nav_menu@2x.png */; }; 102 | D7D5D96816DF80C600C25B65 /* nav_back.png in Resources */ = {isa = PBXBuildFile; fileRef = D7D5D96616DF80C600C25B65 /* nav_back.png */; }; 103 | D7D5D96916DF80C600C25B65 /* nav_back@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = D7D5D96716DF80C600C25B65 /* nav_back@2x.png */; }; 104 | D7D5D96C16DF988F00C25B65 /* nav_bar_bg.png in Resources */ = {isa = PBXBuildFile; fileRef = D7D5D96A16DF988F00C25B65 /* nav_bar_bg.png */; }; 105 | D7D5D96D16DF988F00C25B65 /* nav_bar_bg@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = D7D5D96B16DF988F00C25B65 /* nav_bar_bg@2x.png */; }; 106 | D7D5D97016DF9B9100C25B65 /* slide_navigator_shadow.png in Resources */ = {isa = PBXBuildFile; fileRef = D7D5D96E16DF9B9100C25B65 /* slide_navigator_shadow.png */; }; 107 | D7D5D97116DF9B9100C25B65 /* slide_navigator_shadow@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = D7D5D96F16DF9B9100C25B65 /* slide_navigator_shadow@2x.png */; }; 108 | D7D5D97816DFA09400C25B65 /* SFQuestionListCell.m in Sources */ = {isa = PBXBuildFile; fileRef = D7D5D97716DFA09400C25B65 /* SFQuestionListCell.m */; }; 109 | D7DDB3271675A050009DD198 /* back_button_background.png in Resources */ = {isa = PBXBuildFile; fileRef = D7DDB30F1675A050009DD198 /* back_button_background.png */; }; 110 | D7DDB3281675A050009DD198 /* back_button_background@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = D7DDB3101675A050009DD198 /* back_button_background@2x.png */; }; 111 | D7DDB3291675A050009DD198 /* back_button_pressed_background.png in Resources */ = {isa = PBXBuildFile; fileRef = D7DDB3111675A050009DD198 /* back_button_pressed_background.png */; }; 112 | D7DDB32A1675A050009DD198 /* back_button_pressed_background@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = D7DDB3121675A050009DD198 /* back_button_pressed_background@2x.png */; }; 113 | D7DDB32B1675A050009DD198 /* navigationbar_light_background.png in Resources */ = {isa = PBXBuildFile; fileRef = D7DDB3131675A050009DD198 /* navigationbar_light_background.png */; }; 114 | D7DDB32C1675A050009DD198 /* navigationbar_light_background@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = D7DDB3141675A050009DD198 /* navigationbar_light_background@2x.png */; }; 115 | D7DDB32D1675A050009DD198 /* slide_navigator_button.png in Resources */ = {isa = PBXBuildFile; fileRef = D7DDB3151675A050009DD198 /* slide_navigator_button.png */; }; 116 | D7DDB32E1675A050009DD198 /* slide_navigator_button@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = D7DDB3161675A050009DD198 /* slide_navigator_button@2x.png */; }; 117 | D7DDB32F1675A050009DD198 /* slide_navigator_button_pressed.png in Resources */ = {isa = PBXBuildFile; fileRef = D7DDB3171675A050009DD198 /* slide_navigator_button_pressed.png */; }; 118 | D7DDB3301675A050009DD198 /* slide_navigator_button_pressed@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = D7DDB3181675A050009DD198 /* slide_navigator_button_pressed@2x.png */; }; 119 | D7DDB3311675A050009DD198 /* slide_navigator_cell_background.png in Resources */ = {isa = PBXBuildFile; fileRef = D7DDB3191675A050009DD198 /* slide_navigator_cell_background.png */; }; 120 | D7DDB3321675A050009DD198 /* slide_navigator_cell_background@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = D7DDB31A1675A050009DD198 /* slide_navigator_cell_background@2x.png */; }; 121 | D7DDB3331675A050009DD198 /* slide_navigator_cell_chevron.png in Resources */ = {isa = PBXBuildFile; fileRef = D7DDB31B1675A050009DD198 /* slide_navigator_cell_chevron.png */; }; 122 | D7DDB3341675A050009DD198 /* slide_navigator_cell_chevron@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = D7DDB31C1675A050009DD198 /* slide_navigator_cell_chevron@2x.png */; }; 123 | D7DDB3351675A050009DD198 /* slide_navigator_cell_selected_background.png in Resources */ = {isa = PBXBuildFile; fileRef = D7DDB31D1675A050009DD198 /* slide_navigator_cell_selected_background.png */; }; 124 | D7DDB3361675A050009DD198 /* slide_navigator_cell_selected_background@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = D7DDB31E1675A050009DD198 /* slide_navigator_cell_selected_background@2x.png */; }; 125 | D7DDB3371675A050009DD198 /* slide_navigator_cell_selected_chevron.png in Resources */ = {isa = PBXBuildFile; fileRef = D7DDB31F1675A050009DD198 /* slide_navigator_cell_selected_chevron.png */; }; 126 | D7DDB3381675A050009DD198 /* slide_navigator_cell_selected_chevron@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = D7DDB3201675A050009DD198 /* slide_navigator_cell_selected_chevron@2x.png */; }; 127 | D7DDB3391675A050009DD198 /* slide_navigator_dark_backgrond.png in Resources */ = {isa = PBXBuildFile; fileRef = D7DDB3211675A050009DD198 /* slide_navigator_dark_backgrond.png */; }; 128 | D7DDB33A1675A050009DD198 /* slide_navigator_dark_backgrond@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = D7DDB3221675A050009DD198 /* slide_navigator_dark_backgrond@2x.png */; }; 129 | D7DDB33B1675A050009DD198 /* slide_navigator_light_backgrond.png in Resources */ = {isa = PBXBuildFile; fileRef = D7DDB3231675A050009DD198 /* slide_navigator_light_backgrond.png */; }; 130 | D7DDB33C1675A050009DD198 /* slide_navigator_light_backgrond@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = D7DDB3241675A050009DD198 /* slide_navigator_light_backgrond@2x.png */; }; 131 | D7DDB33D1675A050009DD198 /* slide_navigator_section_header_background.png in Resources */ = {isa = PBXBuildFile; fileRef = D7DDB3251675A050009DD198 /* slide_navigator_section_header_background.png */; }; 132 | D7DDB33E1675A050009DD198 /* slide_navigator_section_header_background@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = D7DDB3261675A050009DD198 /* slide_navigator_section_header_background@2x.png */; }; 133 | D7E43B6416A66B44001B6FFA /* GetQuestionDetail.js.txt in Resources */ = {isa = PBXBuildFile; fileRef = D7E43B6316A66B44001B6FFA /* GetQuestionDetail.js.txt */; }; 134 | D7E43B6716A66B57001B6FFA /* GetQuestionAnswer.js.txt in Resources */ = {isa = PBXBuildFile; fileRef = D7E43B6616A66B57001B6FFA /* GetQuestionAnswer.js.txt */; }; 135 | D7E43B6916A677B9001B6FFA /* AnswerDetail.html.txt in Resources */ = {isa = PBXBuildFile; fileRef = D7E43B6816A677B9001B6FFA /* AnswerDetail.html.txt */; }; 136 | D7F0AB9716A408100014F39E /* question_detail_section_header_background.png in Resources */ = {isa = PBXBuildFile; fileRef = D7F0AB9516A408100014F39E /* question_detail_section_header_background.png */; }; 137 | D7F0AB9816A408100014F39E /* question_detail_section_header_background@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = D7F0AB9616A408100014F39E /* question_detail_section_header_background@2x.png */; }; 138 | /* End PBXBuildFile section */ 139 | 140 | /* Begin PBXFileReference section */ 141 | 453D55A4172CFAD7000C5533 /* GTMDefines.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GTMDefines.h; sourceTree = ""; }; 142 | 453D55A7172CFAF9000C5533 /* GTMNSString+HTML.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "GTMNSString+HTML.h"; path = "Foundation/GTMNSString+HTML.h"; sourceTree = ""; }; 143 | 453D55A8172CFAF9000C5533 /* GTMNSString+HTML.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "GTMNSString+HTML.m"; path = "Foundation/GTMNSString+HTML.m"; sourceTree = ""; }; 144 | D70DF7B3168805D300AD1207 /* JSONKit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSONKit.h; sourceTree = ""; }; 145 | D70DF7B4168805D300AD1207 /* JSONKit.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSONKit.m; sourceTree = ""; }; 146 | D70DF7C81688389C00AD1207 /* logout_btn.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = logout_btn.png; sourceTree = ""; }; 147 | D70DF7C91688389C00AD1207 /* logout_btn@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "logout_btn@2x.png"; sourceTree = ""; }; 148 | D70DF7CA1688389C00AD1207 /* logout_btn_pressed.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = logout_btn_pressed.png; sourceTree = ""; }; 149 | D70DF7CB1688389C00AD1207 /* logout_btn_pressed@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "logout_btn_pressed@2x.png"; sourceTree = ""; }; 150 | D70DF80A16883CAA00AD1207 /* goBackItem.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = goBackItem.png; sourceTree = ""; }; 151 | D70DF80B16883CAA00AD1207 /* goBackItem@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "goBackItem@2x.png"; sourceTree = ""; }; 152 | D70DF80C16883CAA00AD1207 /* goForwardItem.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = goForwardItem.png; sourceTree = ""; }; 153 | D70DF80D16883CAA00AD1207 /* goForwardItem@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "goForwardItem@2x.png"; sourceTree = ""; }; 154 | D70DF80E16883CAA00AD1207 /* UMNavigationController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UMNavigationController.h; sourceTree = ""; }; 155 | D70DF80F16883CAA00AD1207 /* UMNavigationController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UMNavigationController.m; sourceTree = ""; }; 156 | D70DF81016883CAA00AD1207 /* UMSlideNavigationController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UMSlideNavigationController.h; sourceTree = ""; }; 157 | D70DF81116883CAA00AD1207 /* UMSlideNavigationController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UMSlideNavigationController.m; sourceTree = ""; }; 158 | D70DF81216883CAA00AD1207 /* UMTools.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UMTools.h; sourceTree = ""; }; 159 | D70DF81316883CAA00AD1207 /* UMTools.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UMTools.m; sourceTree = ""; }; 160 | D70DF81416883CAA00AD1207 /* UMViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UMViewController.h; sourceTree = ""; }; 161 | D70DF81516883CAA00AD1207 /* UMViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UMViewController.m; sourceTree = ""; }; 162 | D70DF81616883CAA00AD1207 /* UMWebViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UMWebViewController.h; sourceTree = ""; }; 163 | D70DF81716883CAA00AD1207 /* UMWebViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UMWebViewController.m; sourceTree = ""; }; 164 | D71B378816E496CC00E7F87C /* question_list_vote.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = question_list_vote.png; sourceTree = ""; }; 165 | D71B378916E496CC00E7F87C /* question_list_vote@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "question_list_vote@2x.png"; sourceTree = ""; }; 166 | D71B4CD116E5C984007484B7 /* question_list_header_bg.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = question_list_header_bg.png; sourceTree = ""; }; 167 | D71B4CD216E5C984007484B7 /* question_list_header_bg@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "question_list_header_bg@2x.png"; sourceTree = ""; }; 168 | D7627872169FCA95007E73B2 /* QuestionDetail.html.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = QuestionDetail.html.txt; sourceTree = ""; }; 169 | D7734D561684B7AB000170FC /* sr_refresh.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = sr_refresh.png; sourceTree = ""; }; 170 | D7734D571684B7AB000170FC /* sr_refresh@2X.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "sr_refresh@2X.png"; sourceTree = ""; }; 171 | D7734D581684B7AB000170FC /* SRDefine.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SRDefine.h; sourceTree = ""; }; 172 | D7734D591684B7AB000170FC /* SRRefreshView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SRRefreshView.h; sourceTree = ""; }; 173 | D7734D5A1684B7AB000170FC /* SRRefreshView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SRRefreshView.m; sourceTree = ""; }; 174 | D7734D5B1684B7AB000170FC /* SRSlimeView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SRSlimeView.h; sourceTree = ""; }; 175 | D7734D5C1684B7AB000170FC /* SRSlimeView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SRSlimeView.m; sourceTree = ""; }; 176 | D7734D621684BE93000170FC /* AFHTTPClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AFHTTPClient.h; sourceTree = ""; }; 177 | D7734D631684BE93000170FC /* AFHTTPClient.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AFHTTPClient.m; sourceTree = ""; }; 178 | D7734D641684BE93000170FC /* AFHTTPRequestOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AFHTTPRequestOperation.h; sourceTree = ""; }; 179 | D7734D651684BE93000170FC /* AFHTTPRequestOperation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AFHTTPRequestOperation.m; sourceTree = ""; }; 180 | D7734D661684BE93000170FC /* AFImageRequestOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AFImageRequestOperation.h; sourceTree = ""; }; 181 | D7734D671684BE93000170FC /* AFImageRequestOperation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AFImageRequestOperation.m; sourceTree = ""; }; 182 | D7734D681684BE93000170FC /* AFJSONRequestOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AFJSONRequestOperation.h; sourceTree = ""; }; 183 | D7734D691684BE93000170FC /* AFJSONRequestOperation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AFJSONRequestOperation.m; sourceTree = ""; }; 184 | D7734D6A1684BE93000170FC /* AFNetworkActivityIndicatorManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AFNetworkActivityIndicatorManager.h; sourceTree = ""; }; 185 | D7734D6B1684BE93000170FC /* AFNetworkActivityIndicatorManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AFNetworkActivityIndicatorManager.m; sourceTree = ""; }; 186 | D7734D6C1684BE93000170FC /* AFNetworking.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AFNetworking.h; sourceTree = ""; }; 187 | D7734D6D1684BE93000170FC /* AFPropertyListRequestOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AFPropertyListRequestOperation.h; sourceTree = ""; }; 188 | D7734D6E1684BE93000170FC /* AFPropertyListRequestOperation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AFPropertyListRequestOperation.m; sourceTree = ""; }; 189 | D7734D6F1684BE93000170FC /* AFURLConnectionOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AFURLConnectionOperation.h; sourceTree = ""; }; 190 | D7734D701684BE93000170FC /* AFURLConnectionOperation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AFURLConnectionOperation.m; sourceTree = ""; }; 191 | D7734D711684BE93000170FC /* AFXMLRequestOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AFXMLRequestOperation.h; sourceTree = ""; }; 192 | D7734D721684BE93000170FC /* AFXMLRequestOperation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AFXMLRequestOperation.m; sourceTree = ""; }; 193 | D7734D731684BE93000170FC /* UIImageView+AFNetworking.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIImageView+AFNetworking.h"; sourceTree = ""; }; 194 | D7734D741684BE93000170FC /* UIImageView+AFNetworking.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIImageView+AFNetworking.m"; sourceTree = ""; }; 195 | D779BF8B16E6F5D600771ECE /* question_list_cell_sep.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = question_list_cell_sep.png; sourceTree = ""; }; 196 | D779BF8C16E6F5D600771ECE /* question_list_cell_sep@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "question_list_cell_sep@2x.png"; sourceTree = ""; }; 197 | D77CE21616611B8B00F1BC9E /* SegmentFault.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = SegmentFault.app; sourceTree = BUILT_PRODUCTS_DIR; }; 198 | D77CE21A16611B8B00F1BC9E /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; 199 | D77CE21C16611B8B00F1BC9E /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; 200 | D77CE21E16611B8B00F1BC9E /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; 201 | D77CE22216611B8B00F1BC9E /* SegmentFault-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "SegmentFault-Info.plist"; sourceTree = ""; }; 202 | D77CE22416611B8B00F1BC9E /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; 203 | D77CE22616611B8B00F1BC9E /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 204 | D77CE22816611B8B00F1BC9E /* SegmentFault-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "SegmentFault-Prefix.pch"; sourceTree = ""; }; 205 | D78452B916E0698100FFBAB9 /* SFLabel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SFLabel.h; sourceTree = ""; }; 206 | D78452BA16E0698100FFBAB9 /* SFLabel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SFLabel.m; sourceTree = ""; }; 207 | D79826CB1663A33900054585 /* CFNetwork.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CFNetwork.framework; path = System/Library/Frameworks/CFNetwork.framework; sourceTree = SDKROOT; }; 208 | D79826CD1663A37400054585 /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = System/Library/Frameworks/SystemConfiguration.framework; sourceTree = SDKROOT; }; 209 | D79826CF1663A37C00054585 /* MobileCoreServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MobileCoreServices.framework; path = System/Library/Frameworks/MobileCoreServices.framework; sourceTree = SDKROOT; }; 210 | D79826D11663A38400054585 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; 211 | D79826D31663A3A500054585 /* libz.1.2.5.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libz.1.2.5.dylib; path = usr/lib/libz.1.2.5.dylib; sourceTree = SDKROOT; }; 212 | D79D2E6C16A2DF2B00BC74DC /* SFQuestion.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SFQuestion.h; sourceTree = ""; }; 213 | D79D2E6D16A2DF2B00BC74DC /* SFQuestion.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SFQuestion.m; sourceTree = ""; }; 214 | D79D2E6F16A2DF2B00BC74DC /* SFAppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SFAppDelegate.h; sourceTree = ""; }; 215 | D79D2E7016A2DF2B00BC74DC /* SFAppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SFAppDelegate.m; sourceTree = ""; }; 216 | D79D2E7216A2DF2B00BC74DC /* SFLoginService.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SFLoginService.h; sourceTree = ""; }; 217 | D79D2E7316A2DF2B00BC74DC /* SFLoginService.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SFLoginService.m; sourceTree = ""; }; 218 | D79D2E7416A2DF2B00BC74DC /* SFQuestionService.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SFQuestionService.h; sourceTree = ""; }; 219 | D79D2E7516A2DF2B00BC74DC /* SFQuestionService.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SFQuestionService.m; sourceTree = ""; }; 220 | D79D2E7716A2DF2B00BC74DC /* SFTools.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SFTools.h; sourceTree = ""; }; 221 | D79D2E7816A2DF2B00BC74DC /* SFTools.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SFTools.m; sourceTree = ""; }; 222 | D79D2E7B16A2DF2B00BC74DC /* SFRootViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SFRootViewController.h; sourceTree = ""; }; 223 | D79D2E7C16A2DF2B00BC74DC /* SFRootViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SFRootViewController.m; sourceTree = ""; }; 224 | D79D2E7D16A2DF2B00BC74DC /* SFWebViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SFWebViewController.h; sourceTree = ""; }; 225 | D79D2E7E16A2DF2B00BC74DC /* SFWebViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SFWebViewController.m; sourceTree = ""; }; 226 | D79D2E7F16A2DF2B00BC74DC /* SFLoginViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SFLoginViewController.h; sourceTree = ""; }; 227 | D79D2E8016A2DF2B00BC74DC /* SFLoginViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SFLoginViewController.m; sourceTree = ""; }; 228 | D79D2E8116A2DF2B00BC74DC /* SFQuestionDetailViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SFQuestionDetailViewController.h; sourceTree = ""; }; 229 | D79D2E8216A2DF2B00BC74DC /* SFQuestionDetailViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SFQuestionDetailViewController.m; sourceTree = ""; }; 230 | D79D2E8316A2DF2B00BC74DC /* SFQuestionListViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SFQuestionListViewController.h; sourceTree = ""; }; 231 | D79D2E8416A2DF2B00BC74DC /* SFQuestionListViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SFQuestionListViewController.m; sourceTree = ""; }; 232 | D79D2E8816A2DF2B00BC74DC /* SFLocalWebView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SFLocalWebView.h; sourceTree = ""; }; 233 | D79D2E8916A2DF2B00BC74DC /* SFLocalWebView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SFLocalWebView.m; sourceTree = ""; }; 234 | D79D2E9A16A2E07800BC74DC /* SFSlideNavViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SFSlideNavViewController.h; sourceTree = ""; }; 235 | D79D2E9B16A2E07800BC74DC /* SFSlideNavViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SFSlideNavViewController.m; sourceTree = ""; }; 236 | D79D2E9D16A2F78B00BC74DC /* SFMessager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SFMessager.h; sourceTree = ""; }; 237 | D79D2E9E16A2F78B00BC74DC /* SFMessager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SFMessager.m; sourceTree = ""; }; 238 | D7A9867D16845EE200AB9A61 /* qlist_cell_pop.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = qlist_cell_pop.png; sourceTree = ""; }; 239 | D7A9867E16845EE200AB9A61 /* qlist_cell_pop@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "qlist_cell_pop@2x.png"; sourceTree = ""; }; 240 | D7A9867F16845EE200AB9A61 /* qlist_cell_pop_unanswered.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = qlist_cell_pop_unanswered.png; sourceTree = ""; }; 241 | D7A9868016845EE200AB9A61 /* qlist_cell_pop_unanswered@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "qlist_cell_pop_unanswered@2x.png"; sourceTree = ""; }; 242 | D7A9868116845EE200AB9A61 /* qlist_cell_selected_background.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = qlist_cell_selected_background.png; sourceTree = ""; }; 243 | D7A9868216845EE200AB9A61 /* qlist_cell_selected_background@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "qlist_cell_selected_background@2x.png"; sourceTree = ""; }; 244 | D7B217B21685CC3B001269EB /* Kache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Kache.h; sourceTree = ""; }; 245 | D7B217B31685CC3B001269EB /* Kache.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Kache.m; sourceTree = ""; }; 246 | D7B217B41685CC3B001269EB /* KCH.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KCH.h; sourceTree = ""; }; 247 | D7B217B51685CC3B001269EB /* KConfig.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KConfig.h; sourceTree = ""; }; 248 | D7B217B61685CC3B001269EB /* KHolder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KHolder.h; sourceTree = ""; }; 249 | D7B217B71685CC3B001269EB /* KHolder.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KHolder.m; sourceTree = ""; }; 250 | D7B217B81685CC3B001269EB /* KObject.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KObject.h; sourceTree = ""; }; 251 | D7B217B91685CC3B001269EB /* KObject.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KObject.m; sourceTree = ""; }; 252 | D7B217BA1685CC3B001269EB /* KPool.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KPool.h; sourceTree = ""; }; 253 | D7B217BB1685CC3B001269EB /* KPool.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KPool.m; sourceTree = ""; }; 254 | D7B217BC1685CC3B001269EB /* KQueue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KQueue.h; sourceTree = ""; }; 255 | D7B217BD1685CC3B001269EB /* KQueue.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KQueue.m; sourceTree = ""; }; 256 | D7B217BE1685CC3B001269EB /* KUtil.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KUtil.h; sourceTree = ""; }; 257 | D7B217BF1685CC3B001269EB /* KUtil.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KUtil.m; sourceTree = ""; }; 258 | D7C09C69166323090066EAF5 /* Default-568h@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-568h@2x.png"; sourceTree = ""; }; 259 | D7C09C6A166323090066EAF5 /* Default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Default.png; sourceTree = ""; }; 260 | D7C09C6B166323090066EAF5 /* Default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default@2x.png"; sourceTree = ""; }; 261 | D7D408821687253D00C5C256 /* AnswerDetail.js.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = AnswerDetail.js.txt; sourceTree = ""; }; 262 | D7D4F31E16635B5B003B43EE /* Icon-72.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Icon-72.png"; sourceTree = ""; }; 263 | D7D4F31F16635B5B003B43EE /* Icon-Small-50.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Icon-Small-50.png"; sourceTree = ""; }; 264 | D7D4F32016635B5B003B43EE /* Icon-Small.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Icon-Small.png"; sourceTree = ""; }; 265 | D7D4F32116635B5B003B43EE /* Icon-Small@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Icon-Small@2x.png"; sourceTree = ""; }; 266 | D7D4F32216635B5B003B43EE /* Icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Icon.png; sourceTree = ""; }; 267 | D7D4F32316635B5B003B43EE /* Icon@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Icon@2x.png"; sourceTree = ""; }; 268 | D7D4F32416635B5B003B43EE /* iTunesArtwork.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = iTunesArtwork.png; sourceTree = ""; }; 269 | D7D5D95216DF7F5B00C25B65 /* nav_cell_arrow_active.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = nav_cell_arrow_active.png; sourceTree = ""; }; 270 | D7D5D95316DF7F5B00C25B65 /* nav_cell_arrow_active@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "nav_cell_arrow_active@2x.png"; sourceTree = ""; }; 271 | D7D5D95416DF7F5B00C25B65 /* nav_cell_arrow.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = nav_cell_arrow.png; sourceTree = ""; }; 272 | D7D5D95516DF7F5B00C25B65 /* nav_cell_arrow@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "nav_cell_arrow@2x.png"; sourceTree = ""; }; 273 | D7D5D95616DF7F5B00C25B65 /* nav_cell_bg_active.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = nav_cell_bg_active.png; sourceTree = ""; }; 274 | D7D5D95716DF7F5B00C25B65 /* nav_cell_bg_active@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "nav_cell_bg_active@2x.png"; sourceTree = ""; }; 275 | D7D5D95816DF7F5B00C25B65 /* nav_cell_bg.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = nav_cell_bg.png; sourceTree = ""; }; 276 | D7D5D95916DF7F5B00C25B65 /* nav_cell_bg@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "nav_cell_bg@2x.png"; sourceTree = ""; }; 277 | D7D5D95A16DF7F5B00C25B65 /* nav_menu.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = nav_menu.png; sourceTree = ""; }; 278 | D7D5D95B16DF7F5B00C25B65 /* nav_menu@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "nav_menu@2x.png"; sourceTree = ""; }; 279 | D7D5D96616DF80C600C25B65 /* nav_back.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = nav_back.png; sourceTree = ""; }; 280 | D7D5D96716DF80C600C25B65 /* nav_back@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "nav_back@2x.png"; sourceTree = ""; }; 281 | D7D5D96A16DF988F00C25B65 /* nav_bar_bg.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = nav_bar_bg.png; sourceTree = ""; }; 282 | D7D5D96B16DF988F00C25B65 /* nav_bar_bg@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "nav_bar_bg@2x.png"; sourceTree = ""; }; 283 | D7D5D96E16DF9B9100C25B65 /* slide_navigator_shadow.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = slide_navigator_shadow.png; sourceTree = ""; }; 284 | D7D5D96F16DF9B9100C25B65 /* slide_navigator_shadow@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "slide_navigator_shadow@2x.png"; sourceTree = ""; }; 285 | D7D5D97616DFA09400C25B65 /* SFQuestionListCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SFQuestionListCell.h; sourceTree = ""; }; 286 | D7D5D97716DFA09400C25B65 /* SFQuestionListCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SFQuestionListCell.m; sourceTree = ""; }; 287 | D7DDB30F1675A050009DD198 /* back_button_background.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = back_button_background.png; sourceTree = ""; }; 288 | D7DDB3101675A050009DD198 /* back_button_background@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "back_button_background@2x.png"; sourceTree = ""; }; 289 | D7DDB3111675A050009DD198 /* back_button_pressed_background.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = back_button_pressed_background.png; sourceTree = ""; }; 290 | D7DDB3121675A050009DD198 /* back_button_pressed_background@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "back_button_pressed_background@2x.png"; sourceTree = ""; }; 291 | D7DDB3131675A050009DD198 /* navigationbar_light_background.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = navigationbar_light_background.png; sourceTree = ""; }; 292 | D7DDB3141675A050009DD198 /* navigationbar_light_background@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "navigationbar_light_background@2x.png"; sourceTree = ""; }; 293 | D7DDB3151675A050009DD198 /* slide_navigator_button.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = slide_navigator_button.png; sourceTree = ""; }; 294 | D7DDB3161675A050009DD198 /* slide_navigator_button@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "slide_navigator_button@2x.png"; sourceTree = ""; }; 295 | D7DDB3171675A050009DD198 /* slide_navigator_button_pressed.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = slide_navigator_button_pressed.png; sourceTree = ""; }; 296 | D7DDB3181675A050009DD198 /* slide_navigator_button_pressed@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "slide_navigator_button_pressed@2x.png"; sourceTree = ""; }; 297 | D7DDB3191675A050009DD198 /* slide_navigator_cell_background.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = slide_navigator_cell_background.png; sourceTree = ""; }; 298 | D7DDB31A1675A050009DD198 /* slide_navigator_cell_background@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "slide_navigator_cell_background@2x.png"; sourceTree = ""; }; 299 | D7DDB31B1675A050009DD198 /* slide_navigator_cell_chevron.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = slide_navigator_cell_chevron.png; sourceTree = ""; }; 300 | D7DDB31C1675A050009DD198 /* slide_navigator_cell_chevron@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "slide_navigator_cell_chevron@2x.png"; sourceTree = ""; }; 301 | D7DDB31D1675A050009DD198 /* slide_navigator_cell_selected_background.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = slide_navigator_cell_selected_background.png; sourceTree = ""; }; 302 | D7DDB31E1675A050009DD198 /* slide_navigator_cell_selected_background@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "slide_navigator_cell_selected_background@2x.png"; sourceTree = ""; }; 303 | D7DDB31F1675A050009DD198 /* slide_navigator_cell_selected_chevron.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = slide_navigator_cell_selected_chevron.png; sourceTree = ""; }; 304 | D7DDB3201675A050009DD198 /* slide_navigator_cell_selected_chevron@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "slide_navigator_cell_selected_chevron@2x.png"; sourceTree = ""; }; 305 | D7DDB3211675A050009DD198 /* slide_navigator_dark_backgrond.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = slide_navigator_dark_backgrond.png; sourceTree = ""; }; 306 | D7DDB3221675A050009DD198 /* slide_navigator_dark_backgrond@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "slide_navigator_dark_backgrond@2x.png"; sourceTree = ""; }; 307 | D7DDB3231675A050009DD198 /* slide_navigator_light_backgrond.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = slide_navigator_light_backgrond.png; sourceTree = ""; }; 308 | D7DDB3241675A050009DD198 /* slide_navigator_light_backgrond@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "slide_navigator_light_backgrond@2x.png"; sourceTree = ""; }; 309 | D7DDB3251675A050009DD198 /* slide_navigator_section_header_background.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = slide_navigator_section_header_background.png; sourceTree = ""; }; 310 | D7DDB3261675A050009DD198 /* slide_navigator_section_header_background@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "slide_navigator_section_header_background@2x.png"; sourceTree = ""; }; 311 | D7E43B6316A66B44001B6FFA /* GetQuestionDetail.js.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = GetQuestionDetail.js.txt; sourceTree = ""; }; 312 | D7E43B6616A66B57001B6FFA /* GetQuestionAnswer.js.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = GetQuestionAnswer.js.txt; sourceTree = ""; }; 313 | D7E43B6816A677B9001B6FFA /* AnswerDetail.html.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = AnswerDetail.html.txt; sourceTree = ""; }; 314 | D7F0AB9516A408100014F39E /* question_detail_section_header_background.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = question_detail_section_header_background.png; sourceTree = ""; }; 315 | D7F0AB9616A408100014F39E /* question_detail_section_header_background@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "question_detail_section_header_background@2x.png"; sourceTree = ""; }; 316 | /* End PBXFileReference section */ 317 | 318 | /* Begin PBXFrameworksBuildPhase section */ 319 | D77CE21316611B8B00F1BC9E /* Frameworks */ = { 320 | isa = PBXFrameworksBuildPhase; 321 | buildActionMask = 2147483647; 322 | files = ( 323 | D79826D41663A3A500054585 /* libz.1.2.5.dylib in Frameworks */, 324 | D79826D21663A38400054585 /* QuartzCore.framework in Frameworks */, 325 | D79826D01663A37C00054585 /* MobileCoreServices.framework in Frameworks */, 326 | D79826CE1663A37400054585 /* SystemConfiguration.framework in Frameworks */, 327 | D79826CC1663A33900054585 /* CFNetwork.framework in Frameworks */, 328 | D77CE21B16611B8B00F1BC9E /* UIKit.framework in Frameworks */, 329 | D77CE21D16611B8B00F1BC9E /* Foundation.framework in Frameworks */, 330 | D77CE21F16611B8B00F1BC9E /* CoreGraphics.framework in Frameworks */, 331 | ); 332 | runOnlyForDeploymentPostprocessing = 0; 333 | }; 334 | /* End PBXFrameworksBuildPhase section */ 335 | 336 | /* Begin PBXGroup section */ 337 | 453D55A3172CF88A000C5533 /* GTM */ = { 338 | isa = PBXGroup; 339 | children = ( 340 | 453D55A7172CFAF9000C5533 /* GTMNSString+HTML.h */, 341 | 453D55A8172CFAF9000C5533 /* GTMNSString+HTML.m */, 342 | 453D55A4172CFAD7000C5533 /* GTMDefines.h */, 343 | ); 344 | name = GTM; 345 | path = Support/GTM; 346 | sourceTree = ""; 347 | }; 348 | D70DF7B1168805D300AD1207 /* JSONKit */ = { 349 | isa = PBXGroup; 350 | children = ( 351 | D70DF7B3168805D300AD1207 /* JSONKit.h */, 352 | D70DF7B4168805D300AD1207 /* JSONKit.m */, 353 | ); 354 | name = JSONKit; 355 | path = Support/JSONKit; 356 | sourceTree = ""; 357 | }; 358 | D70DF7C71688389C00AD1207 /* logout */ = { 359 | isa = PBXGroup; 360 | children = ( 361 | D70DF7C81688389C00AD1207 /* logout_btn.png */, 362 | D70DF7C91688389C00AD1207 /* logout_btn@2x.png */, 363 | D70DF7CA1688389C00AD1207 /* logout_btn_pressed.png */, 364 | D70DF7CB1688389C00AD1207 /* logout_btn_pressed@2x.png */, 365 | ); 366 | path = logout; 367 | sourceTree = ""; 368 | }; 369 | D70DF80916883CAA00AD1207 /* URLManager */ = { 370 | isa = PBXGroup; 371 | children = ( 372 | D7D5D96E16DF9B9100C25B65 /* slide_navigator_shadow.png */, 373 | D7D5D96F16DF9B9100C25B65 /* slide_navigator_shadow@2x.png */, 374 | D70DF80A16883CAA00AD1207 /* goBackItem.png */, 375 | D70DF80B16883CAA00AD1207 /* goBackItem@2x.png */, 376 | D70DF80C16883CAA00AD1207 /* goForwardItem.png */, 377 | D70DF80D16883CAA00AD1207 /* goForwardItem@2x.png */, 378 | D70DF80E16883CAA00AD1207 /* UMNavigationController.h */, 379 | D70DF80F16883CAA00AD1207 /* UMNavigationController.m */, 380 | D70DF81016883CAA00AD1207 /* UMSlideNavigationController.h */, 381 | D70DF81116883CAA00AD1207 /* UMSlideNavigationController.m */, 382 | D70DF81216883CAA00AD1207 /* UMTools.h */, 383 | D70DF81316883CAA00AD1207 /* UMTools.m */, 384 | D70DF81416883CAA00AD1207 /* UMViewController.h */, 385 | D70DF81516883CAA00AD1207 /* UMViewController.m */, 386 | D70DF81616883CAA00AD1207 /* UMWebViewController.h */, 387 | D70DF81716883CAA00AD1207 /* UMWebViewController.m */, 388 | ); 389 | name = URLManager; 390 | path = Support/URLManager/URLManager; 391 | sourceTree = ""; 392 | }; 393 | D71B378716E496CC00E7F87C /* questionlist */ = { 394 | isa = PBXGroup; 395 | children = ( 396 | D779BF8B16E6F5D600771ECE /* question_list_cell_sep.png */, 397 | D779BF8C16E6F5D600771ECE /* question_list_cell_sep@2x.png */, 398 | D71B378816E496CC00E7F87C /* question_list_vote.png */, 399 | D71B378916E496CC00E7F87C /* question_list_vote@2x.png */, 400 | ); 401 | path = questionlist; 402 | sourceTree = ""; 403 | }; 404 | D71B4CD016E5C984007484B7 /* questiondetail */ = { 405 | isa = PBXGroup; 406 | children = ( 407 | D71B4CD116E5C984007484B7 /* question_list_header_bg.png */, 408 | D71B4CD216E5C984007484B7 /* question_list_header_bg@2x.png */, 409 | ); 410 | path = questiondetail; 411 | sourceTree = ""; 412 | }; 413 | D72DF09416DCB8D30001EBF7 /* imagesV2 */ = { 414 | isa = PBXGroup; 415 | children = ( 416 | D71B4CD016E5C984007484B7 /* questiondetail */, 417 | D71B378716E496CC00E7F87C /* questionlist */, 418 | D72DF09516DCB8D30001EBF7 /* nav */, 419 | ); 420 | path = imagesV2; 421 | sourceTree = ""; 422 | }; 423 | D72DF09516DCB8D30001EBF7 /* nav */ = { 424 | isa = PBXGroup; 425 | children = ( 426 | D7D5D96A16DF988F00C25B65 /* nav_bar_bg.png */, 427 | D7D5D96B16DF988F00C25B65 /* nav_bar_bg@2x.png */, 428 | D7D5D96616DF80C600C25B65 /* nav_back.png */, 429 | D7D5D96716DF80C600C25B65 /* nav_back@2x.png */, 430 | D7D5D95216DF7F5B00C25B65 /* nav_cell_arrow_active.png */, 431 | D7D5D95316DF7F5B00C25B65 /* nav_cell_arrow_active@2x.png */, 432 | D7D5D95416DF7F5B00C25B65 /* nav_cell_arrow.png */, 433 | D7D5D95516DF7F5B00C25B65 /* nav_cell_arrow@2x.png */, 434 | D7D5D95616DF7F5B00C25B65 /* nav_cell_bg_active.png */, 435 | D7D5D95716DF7F5B00C25B65 /* nav_cell_bg_active@2x.png */, 436 | D7D5D95816DF7F5B00C25B65 /* nav_cell_bg.png */, 437 | D7D5D95916DF7F5B00C25B65 /* nav_cell_bg@2x.png */, 438 | D7D5D95A16DF7F5B00C25B65 /* nav_menu.png */, 439 | D7D5D95B16DF7F5B00C25B65 /* nav_menu@2x.png */, 440 | ); 441 | path = nav; 442 | sourceTree = ""; 443 | }; 444 | D7734D551684B7AB000170FC /* SlimeRefresh */ = { 445 | isa = PBXGroup; 446 | children = ( 447 | D7734D561684B7AB000170FC /* sr_refresh.png */, 448 | D7734D571684B7AB000170FC /* sr_refresh@2X.png */, 449 | D7734D581684B7AB000170FC /* SRDefine.h */, 450 | D7734D591684B7AB000170FC /* SRRefreshView.h */, 451 | D7734D5A1684B7AB000170FC /* SRRefreshView.m */, 452 | D7734D5B1684B7AB000170FC /* SRSlimeView.h */, 453 | D7734D5C1684B7AB000170FC /* SRSlimeView.m */, 454 | ); 455 | name = SlimeRefresh; 456 | path = Support/SlimeRefresh/SlimeRefresh/SlimeRefresh; 457 | sourceTree = ""; 458 | }; 459 | D7734D611684BE93000170FC /* AFNetworking */ = { 460 | isa = PBXGroup; 461 | children = ( 462 | D7734D621684BE93000170FC /* AFHTTPClient.h */, 463 | D7734D631684BE93000170FC /* AFHTTPClient.m */, 464 | D7734D641684BE93000170FC /* AFHTTPRequestOperation.h */, 465 | D7734D651684BE93000170FC /* AFHTTPRequestOperation.m */, 466 | D7734D661684BE93000170FC /* AFImageRequestOperation.h */, 467 | D7734D671684BE93000170FC /* AFImageRequestOperation.m */, 468 | D7734D681684BE93000170FC /* AFJSONRequestOperation.h */, 469 | D7734D691684BE93000170FC /* AFJSONRequestOperation.m */, 470 | D7734D6A1684BE93000170FC /* AFNetworkActivityIndicatorManager.h */, 471 | D7734D6B1684BE93000170FC /* AFNetworkActivityIndicatorManager.m */, 472 | D7734D6C1684BE93000170FC /* AFNetworking.h */, 473 | D7734D6D1684BE93000170FC /* AFPropertyListRequestOperation.h */, 474 | D7734D6E1684BE93000170FC /* AFPropertyListRequestOperation.m */, 475 | D7734D6F1684BE93000170FC /* AFURLConnectionOperation.h */, 476 | D7734D701684BE93000170FC /* AFURLConnectionOperation.m */, 477 | D7734D711684BE93000170FC /* AFXMLRequestOperation.h */, 478 | D7734D721684BE93000170FC /* AFXMLRequestOperation.m */, 479 | D7734D731684BE93000170FC /* UIImageView+AFNetworking.h */, 480 | D7734D741684BE93000170FC /* UIImageView+AFNetworking.m */, 481 | ); 482 | name = AFNetworking; 483 | path = Support/AFNetworking/AFNetworking; 484 | sourceTree = ""; 485 | }; 486 | D77CE20B16611B8B00F1BC9E = { 487 | isa = PBXGroup; 488 | children = ( 489 | D77CE22016611B8B00F1BC9E /* SegmentFault */, 490 | D77CE21916611B8B00F1BC9E /* Frameworks */, 491 | D77CE21716611B8B00F1BC9E /* Products */, 492 | ); 493 | sourceTree = ""; 494 | }; 495 | D77CE21716611B8B00F1BC9E /* Products */ = { 496 | isa = PBXGroup; 497 | children = ( 498 | D77CE21616611B8B00F1BC9E /* SegmentFault.app */, 499 | ); 500 | name = Products; 501 | sourceTree = ""; 502 | }; 503 | D77CE21916611B8B00F1BC9E /* Frameworks */ = { 504 | isa = PBXGroup; 505 | children = ( 506 | D79826D31663A3A500054585 /* libz.1.2.5.dylib */, 507 | D79826D11663A38400054585 /* QuartzCore.framework */, 508 | D79826CF1663A37C00054585 /* MobileCoreServices.framework */, 509 | D79826CD1663A37400054585 /* SystemConfiguration.framework */, 510 | D79826CB1663A33900054585 /* CFNetwork.framework */, 511 | D77CE21A16611B8B00F1BC9E /* UIKit.framework */, 512 | D77CE21C16611B8B00F1BC9E /* Foundation.framework */, 513 | D77CE21E16611B8B00F1BC9E /* CoreGraphics.framework */, 514 | ); 515 | name = Frameworks; 516 | sourceTree = ""; 517 | }; 518 | D77CE22016611B8B00F1BC9E /* SegmentFault */ = { 519 | isa = PBXGroup; 520 | children = ( 521 | D79D2E8716A2DF2B00BC74DC /* Views */, 522 | D79D2E6B16A2DF2B00BC74DC /* DataCenters */, 523 | D79D2E7116A2DF2B00BC74DC /* Services */, 524 | D79D2E7616A2DF2B00BC74DC /* Tools */, 525 | D79D2E7916A2DF2B00BC74DC /* ViewControllers */, 526 | D79D2E6E16A2DF2B00BC74DC /* Delegates */, 527 | D77CE22116611B8B00F1BC9E /* Supporting Files */, 528 | ); 529 | path = SegmentFault; 530 | sourceTree = ""; 531 | }; 532 | D77CE22116611B8B00F1BC9E /* Supporting Files */ = { 533 | isa = PBXGroup; 534 | children = ( 535 | D7D4087D168724D000C5C256 /* Resource */, 536 | D70DF7B1168805D300AD1207 /* JSONKit */, 537 | D70DF80916883CAA00AD1207 /* URLManager */, 538 | D7B217B11685CC3B001269EB /* Kache */, 539 | D7734D611684BE93000170FC /* AFNetworking */, 540 | 453D55A3172CF88A000C5533 /* GTM */, 541 | D7734D551684B7AB000170FC /* SlimeRefresh */, 542 | D72DF09416DCB8D30001EBF7 /* imagesV2 */, 543 | D7C09C68166323090066EAF5 /* images */, 544 | D77CE22216611B8B00F1BC9E /* SegmentFault-Info.plist */, 545 | D77CE22316611B8B00F1BC9E /* InfoPlist.strings */, 546 | D77CE22616611B8B00F1BC9E /* main.m */, 547 | D77CE22816611B8B00F1BC9E /* SegmentFault-Prefix.pch */, 548 | ); 549 | name = "Supporting Files"; 550 | sourceTree = ""; 551 | }; 552 | D79D2E6B16A2DF2B00BC74DC /* DataCenters */ = { 553 | isa = PBXGroup; 554 | children = ( 555 | D79D2E6C16A2DF2B00BC74DC /* SFQuestion.h */, 556 | D79D2E6D16A2DF2B00BC74DC /* SFQuestion.m */, 557 | ); 558 | path = DataCenters; 559 | sourceTree = ""; 560 | }; 561 | D79D2E6E16A2DF2B00BC74DC /* Delegates */ = { 562 | isa = PBXGroup; 563 | children = ( 564 | D79D2E6F16A2DF2B00BC74DC /* SFAppDelegate.h */, 565 | D79D2E7016A2DF2B00BC74DC /* SFAppDelegate.m */, 566 | ); 567 | path = Delegates; 568 | sourceTree = ""; 569 | }; 570 | D79D2E7116A2DF2B00BC74DC /* Services */ = { 571 | isa = PBXGroup; 572 | children = ( 573 | D79D2E7216A2DF2B00BC74DC /* SFLoginService.h */, 574 | D79D2E7316A2DF2B00BC74DC /* SFLoginService.m */, 575 | D79D2E7416A2DF2B00BC74DC /* SFQuestionService.h */, 576 | D79D2E7516A2DF2B00BC74DC /* SFQuestionService.m */, 577 | ); 578 | path = Services; 579 | sourceTree = ""; 580 | }; 581 | D79D2E7616A2DF2B00BC74DC /* Tools */ = { 582 | isa = PBXGroup; 583 | children = ( 584 | D79D2E7716A2DF2B00BC74DC /* SFTools.h */, 585 | D79D2E7816A2DF2B00BC74DC /* SFTools.m */, 586 | D79D2E9D16A2F78B00BC74DC /* SFMessager.h */, 587 | D79D2E9E16A2F78B00BC74DC /* SFMessager.m */, 588 | ); 589 | path = Tools; 590 | sourceTree = ""; 591 | }; 592 | D79D2E7916A2DF2B00BC74DC /* ViewControllers */ = { 593 | isa = PBXGroup; 594 | children = ( 595 | D79D2E9916A2E07800BC74DC /* Nav */, 596 | D79D2E7A16A2DF2B00BC74DC /* Base */, 597 | D79D2E7F16A2DF2B00BC74DC /* SFLoginViewController.h */, 598 | D79D2E8016A2DF2B00BC74DC /* SFLoginViewController.m */, 599 | D79D2E8116A2DF2B00BC74DC /* SFQuestionDetailViewController.h */, 600 | D79D2E8216A2DF2B00BC74DC /* SFQuestionDetailViewController.m */, 601 | D79D2E8316A2DF2B00BC74DC /* SFQuestionListViewController.h */, 602 | D79D2E8416A2DF2B00BC74DC /* SFQuestionListViewController.m */, 603 | ); 604 | path = ViewControllers; 605 | sourceTree = ""; 606 | }; 607 | D79D2E7A16A2DF2B00BC74DC /* Base */ = { 608 | isa = PBXGroup; 609 | children = ( 610 | D79D2E7B16A2DF2B00BC74DC /* SFRootViewController.h */, 611 | D79D2E7C16A2DF2B00BC74DC /* SFRootViewController.m */, 612 | D79D2E7D16A2DF2B00BC74DC /* SFWebViewController.h */, 613 | D79D2E7E16A2DF2B00BC74DC /* SFWebViewController.m */, 614 | ); 615 | path = Base; 616 | sourceTree = ""; 617 | }; 618 | D79D2E8716A2DF2B00BC74DC /* Views */ = { 619 | isa = PBXGroup; 620 | children = ( 621 | D7D5D97516DFA07900C25B65 /* Cells */, 622 | D79D2E8816A2DF2B00BC74DC /* SFLocalWebView.h */, 623 | D79D2E8916A2DF2B00BC74DC /* SFLocalWebView.m */, 624 | D78452B916E0698100FFBAB9 /* SFLabel.h */, 625 | D78452BA16E0698100FFBAB9 /* SFLabel.m */, 626 | ); 627 | path = Views; 628 | sourceTree = ""; 629 | }; 630 | D79D2E9916A2E07800BC74DC /* Nav */ = { 631 | isa = PBXGroup; 632 | children = ( 633 | D79D2E9A16A2E07800BC74DC /* SFSlideNavViewController.h */, 634 | D79D2E9B16A2E07800BC74DC /* SFSlideNavViewController.m */, 635 | ); 636 | path = Nav; 637 | sourceTree = ""; 638 | }; 639 | D7A9867C16845EE200AB9A61 /* questionlist */ = { 640 | isa = PBXGroup; 641 | children = ( 642 | D7A9867D16845EE200AB9A61 /* qlist_cell_pop.png */, 643 | D7A9867E16845EE200AB9A61 /* qlist_cell_pop@2x.png */, 644 | D7A9867F16845EE200AB9A61 /* qlist_cell_pop_unanswered.png */, 645 | D7A9868016845EE200AB9A61 /* qlist_cell_pop_unanswered@2x.png */, 646 | D7A9868116845EE200AB9A61 /* qlist_cell_selected_background.png */, 647 | D7A9868216845EE200AB9A61 /* qlist_cell_selected_background@2x.png */, 648 | ); 649 | path = questionlist; 650 | sourceTree = ""; 651 | }; 652 | D7B217B11685CC3B001269EB /* Kache */ = { 653 | isa = PBXGroup; 654 | children = ( 655 | D7B217B21685CC3B001269EB /* Kache.h */, 656 | D7B217B31685CC3B001269EB /* Kache.m */, 657 | D7B217B41685CC3B001269EB /* KCH.h */, 658 | D7B217B51685CC3B001269EB /* KConfig.h */, 659 | D7B217B61685CC3B001269EB /* KHolder.h */, 660 | D7B217B71685CC3B001269EB /* KHolder.m */, 661 | D7B217B81685CC3B001269EB /* KObject.h */, 662 | D7B217B91685CC3B001269EB /* KObject.m */, 663 | D7B217BA1685CC3B001269EB /* KPool.h */, 664 | D7B217BB1685CC3B001269EB /* KPool.m */, 665 | D7B217BC1685CC3B001269EB /* KQueue.h */, 666 | D7B217BD1685CC3B001269EB /* KQueue.m */, 667 | D7B217BE1685CC3B001269EB /* KUtil.h */, 668 | D7B217BF1685CC3B001269EB /* KUtil.m */, 669 | ); 670 | name = Kache; 671 | path = Support/Kache/Kache; 672 | sourceTree = ""; 673 | }; 674 | D7C09C68166323090066EAF5 /* images */ = { 675 | isa = PBXGroup; 676 | children = ( 677 | D7C09C69166323090066EAF5 /* Default-568h@2x.png */, 678 | D7C09C6A166323090066EAF5 /* Default.png */, 679 | D7C09C6B166323090066EAF5 /* Default@2x.png */, 680 | D70DF7C71688389C00AD1207 /* logout */, 681 | D7F0AB9416A408100014F39E /* questiondetail */, 682 | D7A9867C16845EE200AB9A61 /* questionlist */, 683 | D7D4F31D16635B5B003B43EE /* icons */, 684 | D7DDB30E1675A050009DD198 /* nav */, 685 | ); 686 | path = images; 687 | sourceTree = ""; 688 | }; 689 | D7D4087D168724D000C5C256 /* Resource */ = { 690 | isa = PBXGroup; 691 | children = ( 692 | D7E43B6316A66B44001B6FFA /* GetQuestionDetail.js.txt */, 693 | D7E43B6616A66B57001B6FFA /* GetQuestionAnswer.js.txt */, 694 | D7D408821687253D00C5C256 /* AnswerDetail.js.txt */, 695 | D7627872169FCA95007E73B2 /* QuestionDetail.html.txt */, 696 | D7E43B6816A677B9001B6FFA /* AnswerDetail.html.txt */, 697 | ); 698 | path = Resource; 699 | sourceTree = ""; 700 | }; 701 | D7D4F31D16635B5B003B43EE /* icons */ = { 702 | isa = PBXGroup; 703 | children = ( 704 | D7D4F31E16635B5B003B43EE /* Icon-72.png */, 705 | D7D4F31F16635B5B003B43EE /* Icon-Small-50.png */, 706 | D7D4F32016635B5B003B43EE /* Icon-Small.png */, 707 | D7D4F32116635B5B003B43EE /* Icon-Small@2x.png */, 708 | D7D4F32216635B5B003B43EE /* Icon.png */, 709 | D7D4F32316635B5B003B43EE /* Icon@2x.png */, 710 | D7D4F32416635B5B003B43EE /* iTunesArtwork.png */, 711 | ); 712 | path = icons; 713 | sourceTree = ""; 714 | }; 715 | D7D5D97516DFA07900C25B65 /* Cells */ = { 716 | isa = PBXGroup; 717 | children = ( 718 | D7D5D97616DFA09400C25B65 /* SFQuestionListCell.h */, 719 | D7D5D97716DFA09400C25B65 /* SFQuestionListCell.m */, 720 | ); 721 | path = Cells; 722 | sourceTree = ""; 723 | }; 724 | D7DDB30E1675A050009DD198 /* nav */ = { 725 | isa = PBXGroup; 726 | children = ( 727 | D7DDB30F1675A050009DD198 /* back_button_background.png */, 728 | D7DDB3101675A050009DD198 /* back_button_background@2x.png */, 729 | D7DDB3111675A050009DD198 /* back_button_pressed_background.png */, 730 | D7DDB3121675A050009DD198 /* back_button_pressed_background@2x.png */, 731 | D7DDB3131675A050009DD198 /* navigationbar_light_background.png */, 732 | D7DDB3141675A050009DD198 /* navigationbar_light_background@2x.png */, 733 | D7DDB3151675A050009DD198 /* slide_navigator_button.png */, 734 | D7DDB3161675A050009DD198 /* slide_navigator_button@2x.png */, 735 | D7DDB3171675A050009DD198 /* slide_navigator_button_pressed.png */, 736 | D7DDB3181675A050009DD198 /* slide_navigator_button_pressed@2x.png */, 737 | D7DDB3191675A050009DD198 /* slide_navigator_cell_background.png */, 738 | D7DDB31A1675A050009DD198 /* slide_navigator_cell_background@2x.png */, 739 | D7DDB31B1675A050009DD198 /* slide_navigator_cell_chevron.png */, 740 | D7DDB31C1675A050009DD198 /* slide_navigator_cell_chevron@2x.png */, 741 | D7DDB31D1675A050009DD198 /* slide_navigator_cell_selected_background.png */, 742 | D7DDB31E1675A050009DD198 /* slide_navigator_cell_selected_background@2x.png */, 743 | D7DDB31F1675A050009DD198 /* slide_navigator_cell_selected_chevron.png */, 744 | D7DDB3201675A050009DD198 /* slide_navigator_cell_selected_chevron@2x.png */, 745 | D7DDB3211675A050009DD198 /* slide_navigator_dark_backgrond.png */, 746 | D7DDB3221675A050009DD198 /* slide_navigator_dark_backgrond@2x.png */, 747 | D7DDB3231675A050009DD198 /* slide_navigator_light_backgrond.png */, 748 | D7DDB3241675A050009DD198 /* slide_navigator_light_backgrond@2x.png */, 749 | D7DDB3251675A050009DD198 /* slide_navigator_section_header_background.png */, 750 | D7DDB3261675A050009DD198 /* slide_navigator_section_header_background@2x.png */, 751 | ); 752 | path = nav; 753 | sourceTree = ""; 754 | }; 755 | D7F0AB9416A408100014F39E /* questiondetail */ = { 756 | isa = PBXGroup; 757 | children = ( 758 | D7F0AB9516A408100014F39E /* question_detail_section_header_background.png */, 759 | D7F0AB9616A408100014F39E /* question_detail_section_header_background@2x.png */, 760 | ); 761 | path = questiondetail; 762 | sourceTree = ""; 763 | }; 764 | /* End PBXGroup section */ 765 | 766 | /* Begin PBXNativeTarget section */ 767 | D77CE21516611B8B00F1BC9E /* SegmentFault */ = { 768 | isa = PBXNativeTarget; 769 | buildConfigurationList = D77CE23416611B8C00F1BC9E /* Build configuration list for PBXNativeTarget "SegmentFault" */; 770 | buildPhases = ( 771 | D77CE21216611B8B00F1BC9E /* Sources */, 772 | D77CE21316611B8B00F1BC9E /* Frameworks */, 773 | D77CE21416611B8B00F1BC9E /* Resources */, 774 | ); 775 | buildRules = ( 776 | ); 777 | dependencies = ( 778 | ); 779 | name = SegmentFault; 780 | productName = SegmentFault; 781 | productReference = D77CE21616611B8B00F1BC9E /* SegmentFault.app */; 782 | productType = "com.apple.product-type.application"; 783 | }; 784 | /* End PBXNativeTarget section */ 785 | 786 | /* Begin PBXProject section */ 787 | D77CE20D16611B8B00F1BC9E /* Project object */ = { 788 | isa = PBXProject; 789 | attributes = { 790 | CLASSPREFIX = SF; 791 | LastUpgradeCheck = 0450; 792 | ORGANIZATIONNAME = SegmentFault.com; 793 | }; 794 | buildConfigurationList = D77CE21016611B8B00F1BC9E /* Build configuration list for PBXProject "SegmentFault" */; 795 | compatibilityVersion = "Xcode 3.2"; 796 | developmentRegion = English; 797 | hasScannedForEncodings = 0; 798 | knownRegions = ( 799 | en, 800 | ); 801 | mainGroup = D77CE20B16611B8B00F1BC9E; 802 | productRefGroup = D77CE21716611B8B00F1BC9E /* Products */; 803 | projectDirPath = ""; 804 | projectRoot = ""; 805 | targets = ( 806 | D77CE21516611B8B00F1BC9E /* SegmentFault */, 807 | ); 808 | }; 809 | /* End PBXProject section */ 810 | 811 | /* Begin PBXResourcesBuildPhase section */ 812 | D77CE21416611B8B00F1BC9E /* Resources */ = { 813 | isa = PBXResourcesBuildPhase; 814 | buildActionMask = 2147483647; 815 | files = ( 816 | D77CE22516611B8B00F1BC9E /* InfoPlist.strings in Resources */, 817 | D7C09C6C166323090066EAF5 /* Default-568h@2x.png in Resources */, 818 | D7C09C6D166323090066EAF5 /* Default.png in Resources */, 819 | D7C09C6E166323090066EAF5 /* Default@2x.png in Resources */, 820 | D7D4F32516635B5B003B43EE /* Icon-72.png in Resources */, 821 | D7D4F32616635B5B003B43EE /* Icon-Small-50.png in Resources */, 822 | D7D4F32716635B5B003B43EE /* Icon-Small.png in Resources */, 823 | D7D4F32816635B5B003B43EE /* Icon-Small@2x.png in Resources */, 824 | D7D4F32916635B5B003B43EE /* Icon.png in Resources */, 825 | D7D4F32A16635B5B003B43EE /* Icon@2x.png in Resources */, 826 | D7D4F32B16635B5B003B43EE /* iTunesArtwork.png in Resources */, 827 | D7DDB3271675A050009DD198 /* back_button_background.png in Resources */, 828 | D7DDB3281675A050009DD198 /* back_button_background@2x.png in Resources */, 829 | D7DDB3291675A050009DD198 /* back_button_pressed_background.png in Resources */, 830 | D7DDB32A1675A050009DD198 /* back_button_pressed_background@2x.png in Resources */, 831 | D7DDB32B1675A050009DD198 /* navigationbar_light_background.png in Resources */, 832 | D7DDB32C1675A050009DD198 /* navigationbar_light_background@2x.png in Resources */, 833 | D7DDB32D1675A050009DD198 /* slide_navigator_button.png in Resources */, 834 | D7DDB32E1675A050009DD198 /* slide_navigator_button@2x.png in Resources */, 835 | D7DDB32F1675A050009DD198 /* slide_navigator_button_pressed.png in Resources */, 836 | D7DDB3301675A050009DD198 /* slide_navigator_button_pressed@2x.png in Resources */, 837 | D7DDB3311675A050009DD198 /* slide_navigator_cell_background.png in Resources */, 838 | D7DDB3321675A050009DD198 /* slide_navigator_cell_background@2x.png in Resources */, 839 | D7DDB3331675A050009DD198 /* slide_navigator_cell_chevron.png in Resources */, 840 | D7DDB3341675A050009DD198 /* slide_navigator_cell_chevron@2x.png in Resources */, 841 | D7DDB3351675A050009DD198 /* slide_navigator_cell_selected_background.png in Resources */, 842 | D7DDB3361675A050009DD198 /* slide_navigator_cell_selected_background@2x.png in Resources */, 843 | D7DDB3371675A050009DD198 /* slide_navigator_cell_selected_chevron.png in Resources */, 844 | D7DDB3381675A050009DD198 /* slide_navigator_cell_selected_chevron@2x.png in Resources */, 845 | D7DDB3391675A050009DD198 /* slide_navigator_dark_backgrond.png in Resources */, 846 | D7DDB33A1675A050009DD198 /* slide_navigator_dark_backgrond@2x.png in Resources */, 847 | D7DDB33B1675A050009DD198 /* slide_navigator_light_backgrond.png in Resources */, 848 | D7DDB33C1675A050009DD198 /* slide_navigator_light_backgrond@2x.png in Resources */, 849 | D7DDB33D1675A050009DD198 /* slide_navigator_section_header_background.png in Resources */, 850 | D7DDB33E1675A050009DD198 /* slide_navigator_section_header_background@2x.png in Resources */, 851 | D7A9868316845EE200AB9A61 /* qlist_cell_pop.png in Resources */, 852 | D7A9868416845EE200AB9A61 /* qlist_cell_pop@2x.png in Resources */, 853 | D7A9868516845EE200AB9A61 /* qlist_cell_pop_unanswered.png in Resources */, 854 | D7A9868616845EE200AB9A61 /* qlist_cell_pop_unanswered@2x.png in Resources */, 855 | D7A9868716845EE200AB9A61 /* qlist_cell_selected_background.png in Resources */, 856 | D7A9868816845EE200AB9A61 /* qlist_cell_selected_background@2x.png in Resources */, 857 | D7734D5D1684B7AB000170FC /* sr_refresh.png in Resources */, 858 | D7734D5E1684B7AB000170FC /* sr_refresh@2X.png in Resources */, 859 | D7D408831687253D00C5C256 /* AnswerDetail.js.txt in Resources */, 860 | D70DF7CC1688389C00AD1207 /* logout_btn.png in Resources */, 861 | D70DF7CD1688389C00AD1207 /* logout_btn@2x.png in Resources */, 862 | D70DF7CE1688389C00AD1207 /* logout_btn_pressed.png in Resources */, 863 | D70DF7CF1688389C00AD1207 /* logout_btn_pressed@2x.png in Resources */, 864 | D70DF81816883CAA00AD1207 /* goBackItem.png in Resources */, 865 | D70DF81916883CAA00AD1207 /* goBackItem@2x.png in Resources */, 866 | D70DF81A16883CAA00AD1207 /* goForwardItem.png in Resources */, 867 | D70DF81B16883CAA00AD1207 /* goForwardItem@2x.png in Resources */, 868 | D7627873169FCA95007E73B2 /* QuestionDetail.html.txt in Resources */, 869 | D7F0AB9716A408100014F39E /* question_detail_section_header_background.png in Resources */, 870 | D7F0AB9816A408100014F39E /* question_detail_section_header_background@2x.png in Resources */, 871 | D7E43B6416A66B44001B6FFA /* GetQuestionDetail.js.txt in Resources */, 872 | D7E43B6716A66B57001B6FFA /* GetQuestionAnswer.js.txt in Resources */, 873 | D7E43B6916A677B9001B6FFA /* AnswerDetail.html.txt in Resources */, 874 | D7D5D95C16DF7F5B00C25B65 /* nav_cell_arrow_active.png in Resources */, 875 | D7D5D95D16DF7F5B00C25B65 /* nav_cell_arrow_active@2x.png in Resources */, 876 | D7D5D95E16DF7F5B00C25B65 /* nav_cell_arrow.png in Resources */, 877 | D7D5D95F16DF7F5B00C25B65 /* nav_cell_arrow@2x.png in Resources */, 878 | D7D5D96016DF7F5B00C25B65 /* nav_cell_bg_active.png in Resources */, 879 | D7D5D96116DF7F5B00C25B65 /* nav_cell_bg_active@2x.png in Resources */, 880 | D7D5D96216DF7F5B00C25B65 /* nav_cell_bg.png in Resources */, 881 | D7D5D96316DF7F5B00C25B65 /* nav_cell_bg@2x.png in Resources */, 882 | D7D5D96416DF7F5B00C25B65 /* nav_menu.png in Resources */, 883 | D7D5D96516DF7F5B00C25B65 /* nav_menu@2x.png in Resources */, 884 | D7D5D96816DF80C600C25B65 /* nav_back.png in Resources */, 885 | D7D5D96916DF80C600C25B65 /* nav_back@2x.png in Resources */, 886 | D7D5D96C16DF988F00C25B65 /* nav_bar_bg.png in Resources */, 887 | D7D5D96D16DF988F00C25B65 /* nav_bar_bg@2x.png in Resources */, 888 | D7D5D97016DF9B9100C25B65 /* slide_navigator_shadow.png in Resources */, 889 | D7D5D97116DF9B9100C25B65 /* slide_navigator_shadow@2x.png in Resources */, 890 | D71B378A16E496CC00E7F87C /* question_list_vote.png in Resources */, 891 | D71B378B16E496CC00E7F87C /* question_list_vote@2x.png in Resources */, 892 | D71B4CD316E5C984007484B7 /* question_list_header_bg.png in Resources */, 893 | D71B4CD416E5C984007484B7 /* question_list_header_bg@2x.png in Resources */, 894 | D779BF8D16E6F5D600771ECE /* question_list_cell_sep.png in Resources */, 895 | D779BF8E16E6F5D600771ECE /* question_list_cell_sep@2x.png in Resources */, 896 | ); 897 | runOnlyForDeploymentPostprocessing = 0; 898 | }; 899 | /* End PBXResourcesBuildPhase section */ 900 | 901 | /* Begin PBXSourcesBuildPhase section */ 902 | D77CE21216611B8B00F1BC9E /* Sources */ = { 903 | isa = PBXSourcesBuildPhase; 904 | buildActionMask = 2147483647; 905 | files = ( 906 | D77CE22716611B8B00F1BC9E /* main.m in Sources */, 907 | D7734D5F1684B7AB000170FC /* SRRefreshView.m in Sources */, 908 | D7734D601684B7AB000170FC /* SRSlimeView.m in Sources */, 909 | D7734D751684BE93000170FC /* AFHTTPClient.m in Sources */, 910 | D7734D761684BE93000170FC /* AFHTTPRequestOperation.m in Sources */, 911 | D7734D771684BE93000170FC /* AFImageRequestOperation.m in Sources */, 912 | D7734D781684BE93000170FC /* AFJSONRequestOperation.m in Sources */, 913 | D7734D791684BE93000170FC /* AFNetworkActivityIndicatorManager.m in Sources */, 914 | D7734D7A1684BE93000170FC /* AFPropertyListRequestOperation.m in Sources */, 915 | D7734D7B1684BE93000170FC /* AFURLConnectionOperation.m in Sources */, 916 | D7734D7C1684BE93000170FC /* AFXMLRequestOperation.m in Sources */, 917 | D7734D7D1684BE93000170FC /* UIImageView+AFNetworking.m in Sources */, 918 | D7B217C01685CC3B001269EB /* Kache.m in Sources */, 919 | D7B217C11685CC3B001269EB /* KHolder.m in Sources */, 920 | D7B217C21685CC3B001269EB /* KObject.m in Sources */, 921 | D7B217C31685CC3B001269EB /* KPool.m in Sources */, 922 | D7B217C41685CC3B001269EB /* KQueue.m in Sources */, 923 | D7B217C51685CC3B001269EB /* KUtil.m in Sources */, 924 | D70DF7B7168805D300AD1207 /* JSONKit.m in Sources */, 925 | D70DF81C16883CAA00AD1207 /* UMNavigationController.m in Sources */, 926 | D70DF81D16883CAA00AD1207 /* UMSlideNavigationController.m in Sources */, 927 | D70DF81E16883CAA00AD1207 /* UMTools.m in Sources */, 928 | D70DF81F16883CAA00AD1207 /* UMViewController.m in Sources */, 929 | D70DF82016883CAA00AD1207 /* UMWebViewController.m in Sources */, 930 | D79D2E8C16A2DF2B00BC74DC /* SFQuestion.m in Sources */, 931 | D79D2E8D16A2DF2B00BC74DC /* SFAppDelegate.m in Sources */, 932 | D79D2E8E16A2DF2B00BC74DC /* SFLoginService.m in Sources */, 933 | D79D2E8F16A2DF2B00BC74DC /* SFQuestionService.m in Sources */, 934 | D79D2E9016A2DF2B00BC74DC /* SFTools.m in Sources */, 935 | D79D2E9116A2DF2B00BC74DC /* SFRootViewController.m in Sources */, 936 | D79D2E9216A2DF2B00BC74DC /* SFWebViewController.m in Sources */, 937 | D79D2E9316A2DF2B00BC74DC /* SFLoginViewController.m in Sources */, 938 | D79D2E9416A2DF2B00BC74DC /* SFQuestionDetailViewController.m in Sources */, 939 | D79D2E9516A2DF2B00BC74DC /* SFQuestionListViewController.m in Sources */, 940 | D79D2E9716A2DF2B00BC74DC /* SFLocalWebView.m in Sources */, 941 | D79D2E9C16A2E07800BC74DC /* SFSlideNavViewController.m in Sources */, 942 | D79D2E9F16A2F78B00BC74DC /* SFMessager.m in Sources */, 943 | D7D5D97816DFA09400C25B65 /* SFQuestionListCell.m in Sources */, 944 | D78452BB16E0698100FFBAB9 /* SFLabel.m in Sources */, 945 | 453D55A9172CFAF9000C5533 /* GTMNSString+HTML.m in Sources */, 946 | ); 947 | runOnlyForDeploymentPostprocessing = 0; 948 | }; 949 | /* End PBXSourcesBuildPhase section */ 950 | 951 | /* Begin PBXVariantGroup section */ 952 | D77CE22316611B8B00F1BC9E /* InfoPlist.strings */ = { 953 | isa = PBXVariantGroup; 954 | children = ( 955 | D77CE22416611B8B00F1BC9E /* en */, 956 | ); 957 | name = InfoPlist.strings; 958 | sourceTree = ""; 959 | }; 960 | /* End PBXVariantGroup section */ 961 | 962 | /* Begin XCBuildConfiguration section */ 963 | D77CE23216611B8C00F1BC9E /* Debug */ = { 964 | isa = XCBuildConfiguration; 965 | buildSettings = { 966 | ALWAYS_SEARCH_USER_PATHS = NO; 967 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 968 | CLANG_CXX_LIBRARY = "libc++"; 969 | CLANG_ENABLE_OBJC_ARC = YES; 970 | CLANG_WARN_EMPTY_BODY = YES; 971 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 972 | CODE_SIGN_IDENTITY = "iPhone Developer: Jiajun Gao (SXQ4APL29D)"; 973 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer: Jiajun Gao (SXQ4APL29D)"; 974 | COPY_PHASE_STRIP = NO; 975 | GCC_C_LANGUAGE_STANDARD = gnu99; 976 | GCC_DYNAMIC_NO_PIC = NO; 977 | GCC_OPTIMIZATION_LEVEL = 0; 978 | GCC_PREPROCESSOR_DEFINITIONS = ( 979 | "DEBUG=1", 980 | "$(inherited)", 981 | ); 982 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 983 | GCC_WARN_ABOUT_RETURN_TYPE = YES; 984 | GCC_WARN_UNINITIALIZED_AUTOS = YES; 985 | GCC_WARN_UNUSED_VARIABLE = YES; 986 | IPHONEOS_DEPLOYMENT_TARGET = 5.0; 987 | ONLY_ACTIVE_ARCH = YES; 988 | PROVISIONING_PROFILE = "E5C128D9-2487-4E15-88B6-FDE043343538"; 989 | "PROVISIONING_PROFILE[sdk=iphoneos*]" = "E5C128D9-2487-4E15-88B6-FDE043343538"; 990 | SDKROOT = iphoneos; 991 | }; 992 | name = Debug; 993 | }; 994 | D77CE23316611B8C00F1BC9E /* Release */ = { 995 | isa = XCBuildConfiguration; 996 | buildSettings = { 997 | ALWAYS_SEARCH_USER_PATHS = NO; 998 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 999 | CLANG_CXX_LIBRARY = "libc++"; 1000 | CLANG_ENABLE_OBJC_ARC = YES; 1001 | CLANG_WARN_EMPTY_BODY = YES; 1002 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 1003 | CODE_SIGN_IDENTITY = "iPhone Developer: Jiajun Gao (SXQ4APL29D)"; 1004 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer: Jiajun Gao (SXQ4APL29D)"; 1005 | COPY_PHASE_STRIP = YES; 1006 | GCC_C_LANGUAGE_STANDARD = gnu99; 1007 | GCC_WARN_ABOUT_RETURN_TYPE = YES; 1008 | GCC_WARN_UNINITIALIZED_AUTOS = YES; 1009 | GCC_WARN_UNUSED_VARIABLE = YES; 1010 | IPHONEOS_DEPLOYMENT_TARGET = 5.0; 1011 | OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1"; 1012 | PROVISIONING_PROFILE = "E5C128D9-2487-4E15-88B6-FDE043343538"; 1013 | "PROVISIONING_PROFILE[sdk=iphoneos*]" = "E5C128D9-2487-4E15-88B6-FDE043343538"; 1014 | SDKROOT = iphoneos; 1015 | VALIDATE_PRODUCT = YES; 1016 | }; 1017 | name = Release; 1018 | }; 1019 | D77CE23516611B8C00F1BC9E /* Debug */ = { 1020 | isa = XCBuildConfiguration; 1021 | buildSettings = { 1022 | CODE_SIGN_IDENTITY = "iPhone Developer: Jiajun Gao (SXQ4APL29D)"; 1023 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer: Jiajun Gao (SXQ4APL29D)"; 1024 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 1025 | GCC_PREFIX_HEADER = "SegmentFault/SegmentFault-Prefix.pch"; 1026 | INFOPLIST_FILE = "SegmentFault/SegmentFault-Info.plist"; 1027 | PRODUCT_NAME = "$(TARGET_NAME)"; 1028 | PROVISIONING_PROFILE = "3BF43E1E-50E2-4A83-8EAE-29AF10008796"; 1029 | "PROVISIONING_PROFILE[sdk=iphoneos*]" = "3BF43E1E-50E2-4A83-8EAE-29AF10008796"; 1030 | SDKROOT = iphoneos; 1031 | WRAPPER_EXTENSION = app; 1032 | }; 1033 | name = Debug; 1034 | }; 1035 | D77CE23616611B8C00F1BC9E /* Release */ = { 1036 | isa = XCBuildConfiguration; 1037 | buildSettings = { 1038 | CODE_SIGN_IDENTITY = "iPhone Distribution: Jiajun Gao"; 1039 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution: Jiajun Gao"; 1040 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 1041 | GCC_PREFIX_HEADER = "SegmentFault/SegmentFault-Prefix.pch"; 1042 | INFOPLIST_FILE = "SegmentFault/SegmentFault-Info.plist"; 1043 | PRODUCT_NAME = "$(TARGET_NAME)"; 1044 | PROVISIONING_PROFILE = "C4B24950-030E-48A7-AD9E-954C5E896DF2"; 1045 | "PROVISIONING_PROFILE[sdk=iphoneos*]" = "C4B24950-030E-48A7-AD9E-954C5E896DF2"; 1046 | SDKROOT = iphoneos; 1047 | WRAPPER_EXTENSION = app; 1048 | }; 1049 | name = Release; 1050 | }; 1051 | /* End XCBuildConfiguration section */ 1052 | 1053 | /* Begin XCConfigurationList section */ 1054 | D77CE21016611B8B00F1BC9E /* Build configuration list for PBXProject "SegmentFault" */ = { 1055 | isa = XCConfigurationList; 1056 | buildConfigurations = ( 1057 | D77CE23216611B8C00F1BC9E /* Debug */, 1058 | D77CE23316611B8C00F1BC9E /* Release */, 1059 | ); 1060 | defaultConfigurationIsVisible = 0; 1061 | defaultConfigurationName = Release; 1062 | }; 1063 | D77CE23416611B8C00F1BC9E /* Build configuration list for PBXNativeTarget "SegmentFault" */ = { 1064 | isa = XCConfigurationList; 1065 | buildConfigurations = ( 1066 | D77CE23516611B8C00F1BC9E /* Debug */, 1067 | D77CE23616611B8C00F1BC9E /* Release */, 1068 | ); 1069 | defaultConfigurationIsVisible = 0; 1070 | defaultConfigurationName = Release; 1071 | }; 1072 | /* End XCConfigurationList section */ 1073 | }; 1074 | rootObject = D77CE20D16611B8B00F1BC9E /* Project object */; 1075 | } 1076 | -------------------------------------------------------------------------------- /SegmentFault/DataCenters/SFQuestion.h: -------------------------------------------------------------------------------- 1 | // 2 | // SFQuestion.h 3 | // SegmentFault 4 | // 5 | // Created by jiajun on 12/14/12. 6 | // Copyright (c) 2012 SegmentFault.com. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "AFHTTPClient.h" 11 | 12 | typedef void (^SFQuestionDetailLoadedBlock)(NSDictionary *questionInfo, NSInteger answers, NSError *error); 13 | typedef void (^SFQuestionListLoadedBlock)(NSArray *questions, NSError *error); 14 | 15 | @interface SFQuestionHttpClient : AFHTTPClient 16 | 17 | + (SFQuestionHttpClient *)sharedClient; 18 | 19 | @end 20 | 21 | @interface SFQuestion : NSObject 22 | 23 | + (void)questionDetailBy:(NSString *)qid 24 | withBlock:(SFQuestionDetailLoadedBlock)block; 25 | + (void)questionListByPath:(NSString *)path 26 | onPage:(NSInteger)page size:(NSInteger)size 27 | withBlock:(SFQuestionListLoadedBlock)block; 28 | 29 | @end 30 | -------------------------------------------------------------------------------- /SegmentFault/DataCenters/SFQuestion.m: -------------------------------------------------------------------------------- 1 | // 2 | // SFQuestion.m 3 | // SegmentFault 4 | // 5 | // Created by jiajun on 12/14/12. 6 | // Copyright (c) 2012 SegmentFault.com. All rights reserved. 7 | // 8 | 9 | #import "AFJSONRequestOperation.h" 10 | #import "KCH.h" 11 | #import "SFQuestion.h" 12 | #import "GTMNSString+HTML.h" 13 | 14 | @interface SFQuestionHttpClient () 15 | 16 | @end 17 | 18 | @implementation SFQuestionHttpClient 19 | 20 | + (SFQuestionHttpClient *)sharedClient 21 | { 22 | static SFQuestionHttpClient *_sharedClient = nil; 23 | static dispatch_once_t onceToken; 24 | dispatch_once(&onceToken, ^{ 25 | _sharedClient = [[SFQuestionHttpClient alloc] initWithBaseURL:[NSURL URLWithString:@"http://segmentfault.com/"]]; 26 | }); 27 | 28 | return _sharedClient; 29 | } 30 | 31 | - (id)initWithBaseURL:(NSURL *)url { 32 | self = [super initWithBaseURL:url]; 33 | if (!self) { 34 | return nil; 35 | } 36 | 37 | [self registerHTTPOperationClass:[AFJSONRequestOperation class]]; 38 | [self setDefaultHeader:@"Accept" value:@"application/json"]; 39 | 40 | return self; 41 | } 42 | 43 | @end 44 | 45 | @interface SFQuestion () 46 | 47 | 48 | 49 | @property (copy, nonatomic) SFQuestionDetailLoadedBlock detailLoadedBlock; 50 | @property (strong, nonatomic) NSString *questionId; 51 | @property (strong, nonatomic) UIWebView *webView; 52 | 53 | - (void)load; 54 | 55 | @end 56 | 57 | @implementation SFQuestion 58 | 59 | #pragma mark - private 60 | 61 | - (void)load 62 | { 63 | [self.webView stopLoading]; 64 | NSString *url = [NSString stringWithFormat:@"http://segmentfault.com/q/%@", self.questionId]; 65 | NSMutableURLRequest *requestObj = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url]]; 66 | [self.webView loadRequest:requestObj]; 67 | } 68 | 69 | #pragma mark - UIWebViewDelegate 70 | 71 | - (void)webViewDidFinishLoad:(UIWebView *)webView 72 | { 73 | NSString *questionJS = [NSString stringWithFormat:[SFTools contentForFile:@"GetQuestionDetail.js" ofType:@"txt"], self.questionId]; 74 | NSString *question = [webView stringByEvaluatingJavaScriptFromString:questionJS]; 75 | [webView stringByEvaluatingJavaScriptFromString:[SFTools contentForFile:@"AnswerDetail.js" ofType:@"txt"]]; 76 | NSString *answerJS = [SFTools contentForFile:@"GetQuestionAnswer.js" ofType:@"txt"]; 77 | NSString *answer = [webView stringByEvaluatingJavaScriptFromString:answerJS]; 78 | 79 | NSDictionary *questionInfo = [NSDictionary dictionaryWithObjectsAndKeys: 80 | question, @"question", 81 | answer, @"answers", 82 | nil]; 83 | 84 | [Kache setValue:questionInfo 85 | forKey:SFQuestionDetailCacheKey(self.questionId) 86 | expiredAfter:5]; 87 | 88 | if (self.detailLoadedBlock) { 89 | self.detailLoadedBlock(questionInfo, 0, [NSError errorWithDomain:@".segmentfault.com" code:200 userInfo:nil]); 90 | } 91 | } 92 | 93 | - (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error 94 | { 95 | if (self.detailLoadedBlock) { 96 | self.detailLoadedBlock(nil, 0, error); 97 | } 98 | } 99 | 100 | #pragma mark - parent 101 | 102 | - (id)init 103 | { 104 | self = [super init]; 105 | if (self) { 106 | self.webView = [[UIWebView alloc] init]; 107 | self.webView.delegate = self; 108 | 109 | return self; 110 | } 111 | return nil; 112 | } 113 | 114 | #pragma mark - static 115 | 116 | + (void)questionDetailBy:(NSString *)qid 117 | withBlock:(SFQuestionDetailLoadedBlock)block 118 | { 119 | NSDictionary *questionInfo = [Kache valueForKey:SFQuestionDetailCacheKey(qid)]; 120 | if (questionInfo) { 121 | block(questionInfo, 0, [NSError errorWithDomain:@".segmentfault.com" code:200 userInfo:nil]); 122 | } 123 | else { 124 | static SFQuestion *obj = nil; 125 | if (nil == obj) { 126 | obj = [[SFQuestion alloc] init]; 127 | } 128 | obj.questionId = qid; 129 | obj.detailLoadedBlock = block; 130 | [obj load]; 131 | } 132 | } 133 | 134 | + (NSDictionary *)parseItem:(NSDictionary *)item { 135 | NSMutableDictionary * parsedItem = [item mutableCopy]; 136 | NSString * originTitle = parsedItem[@"title"]; 137 | NSLog(@"title = %@", originTitle); 138 | if ([originTitle isKindOfClass:[NSString class]]) { 139 | parsedItem[@"title"] = [originTitle gtm_stringByUnescapingFromHTML]; 140 | return parsedItem; 141 | } else { 142 | return item; 143 | } 144 | } 145 | 146 | + (NSDictionary *)parseData:(NSDictionary *)data { 147 | NSMutableDictionary * parsedData = [data mutableCopy]; 148 | NSMutableArray * items = [parsedData[@"items"] mutableCopy]; 149 | for (int i = 0; i < items.count; ++i) { 150 | NSDictionary * item = items[i]; 151 | items[i] = [self parseItem:item]; 152 | } 153 | parsedData[@"items"] = items; 154 | return parsedData; 155 | 156 | } 157 | 158 | + (void)questionListByPath:(NSString *)path 159 | onPage:(NSInteger)page size:(NSInteger)size 160 | withBlock:(SFQuestionListLoadedBlock)block 161 | { 162 | // From Internet 163 | [[SFQuestionHttpClient sharedClient] getPath:path parameters:[NSDictionary dictionaryWithObjectsAndKeys: 164 | [NSString stringWithFormat:@"%d", page], @"page", 165 | [NSString stringWithFormat:@"%d", size], @"size", 166 | nil] 167 | success:^(AFHTTPRequestOperation *operation, id JSON) { 168 | NSDictionary *data = [JSON valueForKeyPath:@"data"]; 169 | data = [self parseData:data]; 170 | NSInteger status = [[JSON valueForKeyPath:@"status"] intValue]; 171 | if (block) { 172 | block(data[@"items"], [NSError errorWithDomain:@".segmentfault.com" code:status userInfo:nil]); 173 | } 174 | } failure:^(AFHTTPRequestOperation *operation, NSError *error) { 175 | if (block) { 176 | block(nil, error); 177 | } 178 | }]; 179 | } 180 | 181 | @end 182 | -------------------------------------------------------------------------------- /SegmentFault/Delegates/SFAppDelegate.h: -------------------------------------------------------------------------------- 1 | // 2 | // SFAppDelegate.h 3 | // SegmentFault 4 | // 5 | // Created by jiajun on 11/24/12. 6 | // Copyright (c) 2012 SegmentFault.com. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @class SFSlideNavViewController; 12 | @class UMNavigationController; 13 | 14 | @interface SFAppDelegate : UIResponder 15 | 16 | - (void)initSlideNavigator; 17 | 18 | @property (strong, nonatomic) UIWindow *window; 19 | @property (strong, nonatomic) SFSlideNavViewController *navigator; 20 | 21 | @property (strong, nonatomic) UMNavigationController *followedQuestionsNavigator; 22 | @property (strong, nonatomic) UMNavigationController *hottestNavigator; 23 | @property (strong, nonatomic) UMNavigationController *loginNavigator; 24 | @property (strong, nonatomic) UMNavigationController *logoutNavigator; 25 | @property (strong, nonatomic) UMNavigationController *newestNavigator; 26 | @property (strong, nonatomic) UMNavigationController *userProfileNavigator; 27 | @property (strong, nonatomic) UMNavigationController *userSettingsNavigator; 28 | 29 | 30 | @end 31 | -------------------------------------------------------------------------------- /SegmentFault/Delegates/SFAppDelegate.m: -------------------------------------------------------------------------------- 1 | // 2 | // SFAppDelegate.m 3 | // SegmentFault 4 | // 5 | // Created by jiajun on 11/24/12. 6 | // Copyright (c) 2012 SegmentFault.com. All rights reserved. 7 | // 8 | 9 | #import "AFNetworkActivityIndicatorManager.h" 10 | #import "SFAppDelegate.h" 11 | #import "SFLoginService.h" 12 | #import "SFLoginViewController.h" 13 | #import "SFQuestionListViewController.h" 14 | #import "SFSlideNavViewController.h" 15 | #import "UMNavigationController.h" 16 | 17 | #define NAVIGATION_BAR_BTN_RECT CGRectMake(0.0f, 0.0f, 32.0f, 32.0f) 18 | 19 | @implementation SFAppDelegate 20 | 21 | - (void)initURLMapping 22 | { 23 | [[UMNavigationController config] setValuesForKeysWithDictionary:[[NSDictionary alloc] initWithObjectsAndKeys: 24 | @"SFQuestionListViewController", @"sf://questionlist", 25 | @"SFQuestionDetailViewController", @"sf://questiondetail", 26 | @"SFWebViewController", @"http://segmentfault.com", 27 | @"SFWebViewController", @"sf://webview", 28 | @"SFLoginViewController", @"sf://login", 29 | nil]]; 30 | } 31 | 32 | - (void)initSlideNavigator 33 | { 34 | self.navigator = nil; 35 | if ([SFLoginService isLogin]) { 36 | self.navigator = [[SFSlideNavViewController alloc] initWithItems:@[@[self.newestNavigator, self.hottestNavigator, 37 | self.followedQuestionsNavigator, self.userProfileNavigator, self.logoutNavigator]]]; 38 | } 39 | else { 40 | self.navigator = [[SFSlideNavViewController alloc] initWithItems:@[@[self.newestNavigator, self.hottestNavigator, 41 | self.loginNavigator]]]; 42 | } 43 | } 44 | 45 | - (void)initNavigators 46 | { 47 | self.newestNavigator = [[UMNavigationController alloc] initWithRootViewControllerURL:[[NSURL URLWithString:@"sf://questionlist"] 48 | addParams:[NSDictionary dictionaryWithObjectsAndKeys: 49 | @"最新问题", @"title", 50 | @"listnewest", @"list", 51 | nil]]]; 52 | UIButton *nNavBtn = [[UIButton alloc] initWithFrame:NAVIGATION_BAR_BTN_RECT]; 53 | [nNavBtn setBackgroundImage:[UIImage imageNamed:@"nav_menu.png"] forState:UIControlStateNormal]; 54 | [nNavBtn setBackgroundImage:[UIImage imageNamed:@"nav_menu.png"] forState:UIControlStateHighlighted]; 55 | [nNavBtn addTarget:self.navigator action:@selector(slideButtonClicked) forControlEvents:UIControlEventTouchUpInside]; 56 | nNavBtn.showsTouchWhenHighlighted = YES; 57 | UIBarButtonItem *nBtnItem = [[UIBarButtonItem alloc] initWithCustomView:nNavBtn]; 58 | self.newestNavigator.rootViewController.navigationItem.leftBarButtonItem = nBtnItem; 59 | [self.newestNavigator.navigationBar setBackgroundImage:[UIImage imageNamed:@"nav_bar_bg.png"] forBarMetrics:UIBarMetricsDefault]; 60 | self.newestNavigator.title = @"最新问题"; 61 | 62 | self.hottestNavigator = [[UMNavigationController alloc] initWithRootViewControllerURL:[[NSURL URLWithString:@"sf://questionlist"] 63 | addParams:[NSDictionary dictionaryWithObjectsAndKeys: 64 | @"热门问题", @"title", 65 | @"listhottest", @"list", 66 | nil]]]; 67 | UIButton *hNavBtn = [[UIButton alloc] initWithFrame:NAVIGATION_BAR_BTN_RECT]; 68 | [hNavBtn setBackgroundImage:[UIImage imageNamed:@"nav_menu.png"] forState:UIControlStateNormal]; 69 | [hNavBtn setBackgroundImage:[UIImage imageNamed:@"nav_menu.png"] forState:UIControlStateHighlighted]; 70 | hNavBtn.showsTouchWhenHighlighted = YES; 71 | [hNavBtn addTarget:self.navigator action:@selector(slideButtonClicked) forControlEvents:UIControlEventTouchUpInside]; 72 | UIBarButtonItem *hBtnItem = [[UIBarButtonItem alloc] initWithCustomView:hNavBtn]; 73 | self.hottestNavigator.rootViewController.navigationItem.leftBarButtonItem = hBtnItem; 74 | [self.hottestNavigator.navigationBar setBackgroundImage:[UIImage imageNamed:@"nav_bar_bg.png"] forBarMetrics:UIBarMetricsDefault]; 75 | self.hottestNavigator.title = @"热门问题"; 76 | 77 | self.followedQuestionsNavigator = [[UMNavigationController alloc] initWithRootViewControllerURL:[[NSURL URLWithString:@"sf://questionlist"] 78 | addParams:[NSDictionary dictionaryWithObjectsAndKeys: 79 | @"标记的问题", @"title", 80 | @"listbookmarked", @"list", 81 | @"1", @"login", 82 | nil]]]; 83 | UIButton *fQNavBtn = [[UIButton alloc] initWithFrame:NAVIGATION_BAR_BTN_RECT]; 84 | [fQNavBtn setBackgroundImage:[UIImage imageNamed:@"nav_menu.png"] forState:UIControlStateNormal]; 85 | [fQNavBtn setBackgroundImage:[UIImage imageNamed:@"nav_menu.png"] forState:UIControlStateHighlighted]; 86 | fQNavBtn.showsTouchWhenHighlighted = YES; 87 | [fQNavBtn addTarget:self.navigator action:@selector(slideButtonClicked) forControlEvents:UIControlEventTouchUpInside]; 88 | UIBarButtonItem *fQBtnItem = [[UIBarButtonItem alloc] initWithCustomView:fQNavBtn]; 89 | self.followedQuestionsNavigator.rootViewController.navigationItem.leftBarButtonItem = fQBtnItem; 90 | [self.followedQuestionsNavigator.navigationBar setBackgroundImage:[UIImage imageNamed:@"nav_bar_bg.png"] forBarMetrics:UIBarMetricsDefault]; 91 | self.followedQuestionsNavigator.title = @"标记的问题"; 92 | 93 | self.userProfileNavigator = [[UMNavigationController alloc] initWithRootViewControllerURL:[[NSURL URLWithString:@"http://segmentfault.com/user/settings"] 94 | addParams:[NSDictionary dictionaryWithObjectsAndKeys: 95 | @"个人资料", @"title", 96 | @"1", @"login", 97 | nil]]]; 98 | UIButton *fTNavBtn = [[UIButton alloc] initWithFrame:NAVIGATION_BAR_BTN_RECT]; 99 | [fTNavBtn setBackgroundImage:[UIImage imageNamed:@"nav_menu.png"] forState:UIControlStateNormal]; 100 | [fTNavBtn setBackgroundImage:[UIImage imageNamed:@"nav_menu.png"] forState:UIControlStateHighlighted]; 101 | [fTNavBtn addTarget:self.navigator action:@selector(slideButtonClicked) forControlEvents:UIControlEventTouchUpInside]; 102 | fTNavBtn.showsTouchWhenHighlighted = YES; 103 | UIBarButtonItem *fTBtnItem = [[UIBarButtonItem alloc] initWithCustomView:fTNavBtn]; 104 | self.userProfileNavigator.rootViewController.navigationItem.leftBarButtonItem = fTBtnItem; 105 | [self.userProfileNavigator.navigationBar setBackgroundImage:[UIImage imageNamed:@"nav_bar_bg.png"] forBarMetrics:UIBarMetricsDefault]; 106 | self.userProfileNavigator.title = @"个人资料"; 107 | 108 | self.logoutNavigator = [[UMNavigationController alloc] initWithRootViewControllerURL:[[NSURL URLWithString:@"sf://login"] 109 | addParams:[NSDictionary dictionaryWithObjectsAndKeys: 110 | @"退出登录", @"title", 111 | @"1", @"login", 112 | nil]]]; 113 | UIButton *lONavBtn = [[UIButton alloc] initWithFrame:NAVIGATION_BAR_BTN_RECT]; 114 | [lONavBtn setBackgroundImage:[UIImage imageNamed:@"nav_menu.png"] forState:UIControlStateNormal]; 115 | [lONavBtn setBackgroundImage:[UIImage imageNamed:@"nav_menu.png"] forState:UIControlStateHighlighted]; 116 | lONavBtn.showsTouchWhenHighlighted = YES; 117 | [lONavBtn addTarget:self.navigator action:@selector(slideButtonClicked) forControlEvents:UIControlEventTouchUpInside]; 118 | UIBarButtonItem *lOBtnItem = [[UIBarButtonItem alloc] initWithCustomView:lONavBtn]; 119 | self.logoutNavigator.rootViewController.navigationItem.leftBarButtonItem = lOBtnItem; 120 | [self.logoutNavigator.navigationBar setBackgroundImage:[UIImage imageNamed:@"nav_bar_bg.png"] forBarMetrics:UIBarMetricsDefault]; 121 | self.logoutNavigator.title = @"退出登录"; 122 | 123 | self.loginNavigator = [[UMNavigationController alloc] initWithRootViewControllerURL:[[NSURL URLWithString:@"sf://login"] 124 | addParams:[NSDictionary dictionaryWithObjectsAndKeys: 125 | @"用户登录", @"title", 126 | nil]]]; 127 | UIButton *lINavBtn = [[UIButton alloc] initWithFrame:NAVIGATION_BAR_BTN_RECT]; 128 | [lINavBtn setBackgroundImage:[UIImage imageNamed:@"nav_menu.png"] forState:UIControlStateNormal]; 129 | [lINavBtn setBackgroundImage:[UIImage imageNamed:@"nav_menu.png"] forState:UIControlStateHighlighted]; 130 | lINavBtn.showsTouchWhenHighlighted = YES; 131 | [lINavBtn addTarget:self.navigator action:@selector(slideButtonClicked) forControlEvents:UIControlEventTouchUpInside]; 132 | UIBarButtonItem *lIBtnItem = [[UIBarButtonItem alloc] initWithCustomView:lINavBtn]; 133 | self.loginNavigator.rootViewController.navigationItem.leftBarButtonItem = lIBtnItem; 134 | [self.loginNavigator.navigationBar setBackgroundImage:[UIImage imageNamed:@"nav_bar_bg.png"] forBarMetrics:UIBarMetricsDefault]; 135 | self.loginNavigator.title = @"用户登录"; 136 | } 137 | 138 | - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 139 | { 140 | self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 141 | // Override point for customization after application launch. 142 | 143 | [[AFNetworkActivityIndicatorManager sharedManager] setEnabled:YES]; 144 | 145 | [self initURLMapping]; 146 | [self initNavigators]; 147 | [self initSlideNavigator]; 148 | 149 | [self.window addSubview:self.navigator.view]; 150 | 151 | self.window.backgroundColor = [UIColor whiteColor]; 152 | [self.window makeKeyAndVisible]; 153 | 154 | return YES; 155 | } 156 | 157 | - (void)applicationWillResignActive:(UIApplication *)application 158 | { 159 | // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. 160 | // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. 161 | } 162 | 163 | - (void)applicationDidEnterBackground:(UIApplication *)application 164 | { 165 | // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. 166 | // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. 167 | } 168 | 169 | - (void)applicationWillEnterForeground:(UIApplication *)application 170 | { 171 | // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. 172 | } 173 | 174 | - (void)applicationDidBecomeActive:(UIApplication *)application 175 | { 176 | // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. 177 | } 178 | 179 | - (void)applicationWillTerminate:(UIApplication *)application 180 | { 181 | // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. 182 | } 183 | 184 | @end 185 | -------------------------------------------------------------------------------- /SegmentFault/Resource/AnswerDetail.html.txt: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
%@
10 | 11 | 12 | -------------------------------------------------------------------------------- /SegmentFault/Resource/AnswerDetail.js.txt: -------------------------------------------------------------------------------- 1 | var pc = document.getElementsByClassName('post-cell'); 2 | while (0"+document.getElementsByClassName('post-parter')[0].innerHTML+"
" -------------------------------------------------------------------------------- /SegmentFault/Resource/QuestionDetail.html.txt: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
%@
10 | 11 | 12 | -------------------------------------------------------------------------------- /SegmentFault/SegmentFault-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | zh_CN 7 | CFBundleDisplayName 8 | SegmentFault 9 | CFBundleExecutable 10 | ${EXECUTABLE_NAME} 11 | CFBundleIdentifier 12 | com.segmentfault.ios 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | ${PRODUCT_NAME} 17 | CFBundlePackageType 18 | APPL 19 | CFBundleShortVersionString 20 | 2.0.0 21 | CFBundleSignature 22 | ???? 23 | CFBundleVersion 24 | 2.0.0 25 | LSApplicationCategoryType 26 | 27 | LSRequiresIPhoneOS 28 | 29 | UIPrerenderedIcon 30 | 31 | UIRequiredDeviceCapabilities 32 | 33 | armv7 34 | 35 | UIStatusBarStyle 36 | UIStatusBarStyleBlackOpaque 37 | UIStatusBarTintParameters 38 | 39 | UINavigationBar 40 | 41 | Style 42 | UIBarStyleDefault 43 | Translucent 44 | 45 | 46 | 47 | UISupportedInterfaceOrientations 48 | 49 | UIInterfaceOrientationPortrait 50 | 51 | 52 | 53 | -------------------------------------------------------------------------------- /SegmentFault/SegmentFault-Prefix.pch: -------------------------------------------------------------------------------- 1 | // 2 | // Prefix header for all source files of the 'SegmentFault' target in the 'SegmentFault' project 3 | // 4 | 5 | #import 6 | 7 | #ifndef __IPHONE_3_0 8 | #warning "This project uses features only available in iOS SDK 3.0 and later." 9 | #endif 10 | 11 | #ifdef __OBJC__ 12 | #import 13 | #import 14 | #import 15 | 16 | #import "JSONKit.h" 17 | #import "SFMessager.h" 18 | #import "SFQuestion.h" 19 | #import "SFTools.h" 20 | #import "UMTools.h" 21 | 22 | #define RGBCOLOR(r,g,b) [UIColor colorWithRed:(r)/255.0f green:(g)/255.0f blue:(b)/255.0f alpha:1] 23 | #define RGBACOLOR(r,g,b,a) [UIColor colorWithRed:(r)/255.0f green:(g)/255.0f blue:(b)/255.0f alpha:(a)] 24 | 25 | 26 | typedef NS_ENUM(NSInteger, SFQuestionCellType) { 27 | SFQuestionCellTypeQuestion, 28 | SFQuestionCellTypeAnswer 29 | }; 30 | 31 | #endif 32 | 33 | #define SFNotificationDismiss @"sf_notification_dismiss" // 非 FirstResponder 34 | #define SFNotificationLogin @"sf_notification_login" // 登陆成功 35 | #define SFNotificationLogout @"sf_notification_logout" // 登出 36 | #define SFNotificationQuestionLoaded @"sf_notification_question_loaded" // 问题详情加载完毕 37 | #define SFNotificationAnswerLoaded @"sf_notification_answer_loaded" // 问题详情加载完毕 38 | 39 | // 个别使用 40 | #define QUESTION_DETAIL_HEIGHT @"question_detail_height" 41 | #define ANSWER_DETAIL_HEIGHT @"answer_detail_height" 42 | 43 | #define CELL_HEIGHT 44.0f 44 | #define SECTION_HEADER_HEIGHT 29.0f 45 | 46 | #define TAG_LABEL_FONT [UIFont systemFontOfSize:12.0f] 47 | #define QUESTION_TITLE_LABEL_FONT [UIFont boldSystemFontOfSize:16.0f] 48 | 49 | #define SFQuestionDetailCacheKey(qid) [NSString stringWithFormat:@"sfquestion_detail_cache_%@", qid] 50 | -------------------------------------------------------------------------------- /SegmentFault/Services/SFLoginService.h: -------------------------------------------------------------------------------- 1 | // 2 | // SFLoginService.h 3 | // SegmentFault 4 | // 5 | // Created by jiajun on 12/23/12. 6 | // Copyright (c) 2012 SegmentFault.com. All rights reserved. 7 | // 8 | 9 | @class UMViewController; 10 | 11 | @interface SFLoginService : NSObject 12 | 13 | + (BOOL)isLogin; 14 | + (BOOL)loginWithInfo:(NSDictionary *)info; 15 | + (void)logout; 16 | + (void)login:(UMViewController *)vc withCallback:(NSString *)callback; 17 | 18 | @end 19 | -------------------------------------------------------------------------------- /SegmentFault/Services/SFLoginService.m: -------------------------------------------------------------------------------- 1 | // 2 | // SFLoginService.m 3 | // SegmentFault 4 | // 5 | // Created by jiajun on 12/23/12. 6 | // Copyright (c) 2012 SegmentFault.com. All rights reserved. 7 | // 8 | 9 | #import "SFLoginService.h" 10 | #import "UMViewController.h" 11 | 12 | @implementation SFLoginService 13 | 14 | + (BOOL)isLogin 15 | { 16 | if ([[[NSUserDefaults standardUserDefaults] valueForKey:@"sfsess"] length] 17 | && [[[NSUserDefaults standardUserDefaults] valueForKey:@"sfuid"] length]) { 18 | return YES; 19 | } else { 20 | [SFLoginService logout]; 21 | return NO; 22 | } 23 | } 24 | 25 | + (BOOL)loginWithInfo:(NSDictionary *)info 26 | { 27 | BOOL statusCookie = NO; 28 | BOOL statusUID = NO; 29 | if (info && 0 < [info[@"sfsess"] length]) { 30 | [[NSUserDefaults standardUserDefaults] setValue:info[@"sfsess"] forKey:@"sfsess"]; 31 | statusCookie = YES; 32 | } 33 | if (info && 0 < [info[@"sfuid"] length]) { 34 | [[NSUserDefaults standardUserDefaults] setValue:info[@"sfuid"] forKey:@"sfuid"]; 35 | statusUID = YES; 36 | } 37 | [[NSUserDefaults standardUserDefaults] synchronize]; 38 | 39 | return statusCookie && statusUID; 40 | } 41 | 42 | + (void)logout 43 | { 44 | [[NSUserDefaults standardUserDefaults] setValue:@"" forKey:@"sfsess"]; 45 | [[NSUserDefaults standardUserDefaults] setValue:@"" forKey:@"sfuid"]; 46 | NSHTTPCookie *cookie = [NSHTTPCookie cookieWithProperties: 47 | [NSDictionary dictionaryWithObjectsAndKeys: 48 | @"sfsess", NSHTTPCookieName, 49 | @"", NSHTTPCookieValue, 50 | @".segmentfault.com", NSHTTPCookieDomain, 51 | @"segmentfault.com", NSHTTPCookieOriginURL, 52 | @"/", NSHTTPCookiePath, 53 | @"0", NSHTTPCookieVersion, 54 | nil]]; 55 | [[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:cookie]; 56 | NSHTTPCookie *uidCookie = [NSHTTPCookie cookieWithProperties: 57 | [NSDictionary dictionaryWithObjectsAndKeys: 58 | @"sfuid", NSHTTPCookieName, 59 | @"", NSHTTPCookieValue, 60 | @".segmentfault.com", NSHTTPCookieDomain, 61 | @"segmentfault.com", NSHTTPCookieOriginURL, 62 | @"/", NSHTTPCookiePath, 63 | @"0", NSHTTPCookieVersion, 64 | nil]]; 65 | 66 | [[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:uidCookie]; 67 | 68 | [[NSNotificationCenter defaultCenter] postNotificationName:SFNotificationLogout object:nil]; 69 | } 70 | 71 | + (void)login:(UMViewController *)vc withCallback:(NSString *)callback 72 | { 73 | [vc.navigator openURL:[[NSURL URLWithString:@"sf://login"] addParams:[NSDictionary dictionaryWithObjectsAndKeys: 74 | @"登录", @"title", 75 | callback, @"callback", 76 | nil]]]; 77 | } 78 | 79 | @end 80 | -------------------------------------------------------------------------------- /SegmentFault/Services/SFQuestionService.h: -------------------------------------------------------------------------------- 1 | // 2 | // SFQuestionService.h 3 | // SegmentFault 4 | // 5 | // Created by jiajun on 12/14/12. 6 | // Copyright (c) 2012 SegmentFault.com. All rights reserved. 7 | // 8 | 9 | #import "SFQuestion.h" 10 | 11 | @interface SFQuestionService : NSObject 12 | 13 | + (void)getQuestionDetailById:(NSString *)qid withBlock:(SFQuestionDetailLoadedBlock)block; 14 | + (void)getQuestionList:(NSString *)list onPage:(NSInteger)page withBlock:(void (^)(NSArray *questions, NSError *error))block; 15 | 16 | @end 17 | -------------------------------------------------------------------------------- /SegmentFault/Services/SFQuestionService.m: -------------------------------------------------------------------------------- 1 | // 2 | // SFQuestionService.m 3 | // SegmentFault 4 | // 5 | // Created by jiajun on 12/14/12. 6 | // Copyright (c) 2012 SegmentFault.com. All rights reserved. 7 | // 8 | 9 | #import "SFQuestionService.h" 10 | 11 | @implementation SFQuestionService 12 | 13 | + (void)getQuestionList:(NSString *)list onPage:(NSInteger)page 14 | withBlock:(SFQuestionListLoadedBlock)block 15 | { 16 | [SFQuestion questionListByPath:[NSString stringWithFormat:@"api/question?do=%@", list] 17 | onPage:page 18 | size:30 19 | withBlock:block]; 20 | } 21 | 22 | + (void)getQuestionDetailById:(NSString *)qid 23 | withBlock:(SFQuestionDetailLoadedBlock)block 24 | { 25 | [SFQuestion questionDetailBy:qid withBlock:block]; 26 | } 27 | 28 | @end 29 | -------------------------------------------------------------------------------- /SegmentFault/Tools/SFMessager.h: -------------------------------------------------------------------------------- 1 | // 2 | // SFMessager.h 3 | // SegmentFault 4 | // 5 | // Created by jiajun on 1/13/13. 6 | // Copyright (c) 2013 SegmentFault.com. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface SFMessager : NSObject 12 | 13 | + (void)addMessage:(NSString *)message forKey:(NSString *)key; 14 | + (NSString *)messageForKey:(NSString *)key; 15 | 16 | @end 17 | -------------------------------------------------------------------------------- /SegmentFault/Tools/SFMessager.m: -------------------------------------------------------------------------------- 1 | // 2 | // SFMessager.m 3 | // SegmentFault 4 | // 5 | // Created by jiajun on 1/13/13. 6 | // Copyright (c) 2013 SegmentFault.com. All rights reserved. 7 | // 8 | 9 | #import "SFMessager.h" 10 | 11 | @interface NSObject () 12 | 13 | @property (strong, atomic) NSMutableDictionary *messages; 14 | 15 | + (SFMessager *)instance; 16 | 17 | @end 18 | 19 | @implementation SFMessager 20 | 21 | @synthesize messages; 22 | 23 | - (id)init 24 | { 25 | self = [super init]; 26 | if (self) { 27 | self.messages = [[NSMutableDictionary alloc] init]; 28 | return self; 29 | } 30 | return nil; 31 | } 32 | 33 | + (SFMessager *)instance 34 | { 35 | static SFMessager *obj = nil; 36 | if (nil == obj) { 37 | obj = [[SFMessager alloc] init]; 38 | } 39 | return obj; 40 | } 41 | 42 | + (void)addMessage:(NSString *)message forKey:(NSString *)key 43 | { 44 | [[SFMessager instance].messages setValue:message forKey:key]; 45 | } 46 | 47 | + (NSString *)messageForKey:(NSString *)key 48 | { 49 | NSString *message = [[SFMessager instance].messages valueForKey:key]; 50 | [[SFMessager instance].messages removeObjectForKey:key]; 51 | return message; 52 | } 53 | 54 | @end 55 | -------------------------------------------------------------------------------- /SegmentFault/Tools/SFTools.h: -------------------------------------------------------------------------------- 1 | // 2 | // SFTools.h 3 | // SegmentFault 4 | // 5 | // Created by jiajun on 12/6/12. 6 | // Copyright (c) 2012 SegmentFault.com. All rights reserved. 7 | // 8 | 9 | @class SFAppDelegate; 10 | 11 | @interface SFTools : NSObject 12 | 13 | + (NSString *)contentForFile:(NSString *)file ofType:(NSString *)type; 14 | + (SFAppDelegate *)applicationDelegate; 15 | 16 | + (float)heightOfString:(NSString *)string withWidth:(float)width font:(UIFont *)font; 17 | 18 | @end 19 | -------------------------------------------------------------------------------- /SegmentFault/Tools/SFTools.m: -------------------------------------------------------------------------------- 1 | // 2 | // SFTools.m 3 | // SegmentFault 4 | // 5 | // Created by jiajun on 12/6/12. 6 | // Copyright (c) 2012 SegmentFault.com. All rights reserved. 7 | // 8 | 9 | #import "SFTools.h" 10 | #import "SFAppDelegate.h" 11 | 12 | @implementation SFTools 13 | 14 | + (NSString *)contentForFile:(NSString *)file ofType:(NSString *)type 15 | { 16 | NSString*filePath=[[NSBundle mainBundle] pathForResource:file ofType:type]; 17 | NSString *content = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil]; 18 | return content; 19 | } 20 | 21 | + (SFAppDelegate *)applicationDelegate 22 | { 23 | return (SFAppDelegate *)[[UIApplication sharedApplication] delegate]; 24 | } 25 | 26 | + (float)heightOfString:(NSString *)string withWidth:(float)width font:(UIFont *)font 27 | { 28 | if ([NSNull null] == (id)string) { 29 | string = @"暂时没有数据"; 30 | } 31 | CGSize constraintSize = CGSizeMake(width, MAXFLOAT); 32 | CGSize labelSize = [string sizeWithFont:font constrainedToSize:constraintSize lineBreakMode:UILineBreakModeWordWrap]; 33 | return labelSize.height; 34 | } 35 | 36 | @end 37 | -------------------------------------------------------------------------------- /SegmentFault/ViewControllers/Base/SFRootViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // SFRootViewController.h 3 | // SegmentFault 4 | // 5 | // Created by jiajun on 11/28/12. 6 | // Copyright (c) 2012 SegmentFault.com. All rights reserved. 7 | // 8 | 9 | #import "UMViewController.h" 10 | 11 | @interface SFRootViewController : UMViewController 12 | 13 | // 先打开另一个VC(如:登陆),再打开该VC 14 | - (void)delayOpen; 15 | - (void)didLogout; 16 | 17 | @end 18 | -------------------------------------------------------------------------------- /SegmentFault/ViewControllers/Base/SFRootViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // SFRootViewController.m 3 | // SegmentFault 4 | // 5 | // Created by jiajun on 11/28/12. 6 | // Copyright (c) 2012 SegmentFault.com. All rights reserved. 7 | // 8 | 9 | #import "SFLoginService.h" 10 | #import "SFRootViewController.h" 11 | 12 | @interface SFRootViewController () 13 | 14 | // 用来记录将要打开的URL 15 | @property (nonatomic, strong) NSURL *toOpen; 16 | 17 | - (void)back; 18 | 19 | @end 20 | 21 | @implementation SFRootViewController 22 | 23 | #pragma mark - private 24 | 25 | - (void)back 26 | { 27 | [self.navigator popViewControllerAnimated:YES]; 28 | } 29 | 30 | #pragma mark - public 31 | 32 | // 登陆回调方法 33 | - (void)delayOpen 34 | { 35 | [self.navigator openURL:self.toOpen]; 36 | } 37 | 38 | - (void)didLogout 39 | { 40 | } 41 | 42 | #pragma mark - parent 43 | 44 | - (void)openedFromViewControllerWithURL:(NSURL *)aUrl 45 | { 46 | UIButton *navBtn = [[UIButton alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 32.0f, 32.0f)]; 47 | [navBtn addTarget:self action:@selector(back) forControlEvents:UIControlEventTouchUpInside]; 48 | [navBtn setBackgroundImage:[UIImage imageNamed:@"nav_back.png"] forState:UIControlStateNormal]; 49 | [navBtn setBackgroundImage:[UIImage imageNamed:@"nav_back.png"] forState:UIControlStateHighlighted]; 50 | navBtn.showsTouchWhenHighlighted = YES; 51 | UIBarButtonItem *btnItem = [[UIBarButtonItem alloc] initWithCustomView:navBtn]; 52 | self.navigationItem.leftBarButtonItem = btnItem; 53 | } 54 | 55 | - (BOOL)shouldOpenViewControllerWithURL:(NSURL *)aUrl 56 | { 57 | if (! [@"login" isEqualToString:[aUrl host]] 58 | && 1 == [aUrl.params[@"login"] intValue] 59 | && ! [SFLoginService isLogin]) { 60 | self.toOpen = aUrl; 61 | [SFLoginService login:self withCallback:@"delayOpen"]; 62 | return NO; 63 | } 64 | return YES; 65 | } 66 | 67 | #pragma mark 68 | 69 | - (void)viewDidLoad 70 | { 71 | [super viewDidLoad]; 72 | self.view.backgroundColor = [UIColor whiteColor]; 73 | 74 | if (! [@"login" isEqualToString:[self.url host]] 75 | && 1 == [self.params[@"login"] intValue]) { 76 | [[NSNotificationCenter defaultCenter] removeObserver:self name:SFNotificationLogout object:nil]; 77 | [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didLogout) name:SFNotificationLogout object:nil]; 78 | } 79 | 80 | UILabel *label = [[UILabel alloc] initWithFrame:CGRectZero]; 81 | label.backgroundColor = [UIColor clearColor]; 82 | label.font = [UIFont boldSystemFontOfSize:20.0]; 83 | label.textAlignment = NSTextAlignmentCenter; 84 | label.textColor = RGBCOLOR(33.0f, 33.0f, 33.0f); 85 | label.shadowOffset = CGSizeMake(0.0f, 1.0f); 86 | label.shadowColor = [UIColor whiteColor]; 87 | self.navigationItem.titleView = label; 88 | label.text = self.params[@"title"]; 89 | [label sizeToFit]; 90 | 91 | self.navigationItem.titleView = label; 92 | } 93 | 94 | @end 95 | -------------------------------------------------------------------------------- /SegmentFault/ViewControllers/Base/SFWebViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // SFWebViewController.h 3 | // SegmentFault 4 | // 5 | // Created by jiajun on 12/12/12. 6 | // Copyright (c) 2012 SegmentFault.com. All rights reserved. 7 | // 8 | 9 | #import "UMWebViewController.h" 10 | 11 | @interface SFWebViewController : UMWebViewController 12 | 13 | @end -------------------------------------------------------------------------------- /SegmentFault/ViewControllers/Base/SFWebViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // SFWebViewController.m 3 | // SegmentFault 4 | // 5 | // Created by jiajun on 12/12/12. 6 | // Copyright (c) 2012 SegmentFault.com. All rights reserved. 7 | // 8 | 9 | #import "SFWebViewController.h" 10 | #import "UMSlideNavigationController.h" 11 | 12 | @interface SFWebViewController () 13 | 14 | - (void)back; 15 | - (void)dismissKeyboard; 16 | 17 | @end 18 | 19 | @implementation SFWebViewController 20 | 21 | #pragma mark - private 22 | 23 | - (void)back 24 | { 25 | [self.navigator popViewControllerAnimated:YES]; 26 | } 27 | 28 | - (void)dismissKeyboard 29 | { 30 | [self.webView endEditing:YES]; 31 | } 32 | 33 | #pragma mark - parent 34 | 35 | - (void)loadRequest { 36 | if (! [@"http" isEqualToString:[self.url protocol]]) { 37 | self.url = [NSURL URLWithString:self.params[@"url"]]; 38 | } 39 | NSMutableURLRequest *requestObj = [NSMutableURLRequest requestWithURL:self.url]; 40 | [self.webView loadRequest:requestObj]; 41 | } 42 | 43 | - (void)openedFromViewControllerWithURL:(NSURL *)aUrl 44 | { 45 | UIButton *navBtn = [[UIButton alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 32.0f, 32.0f)]; 46 | [navBtn addTarget:self action:@selector(back) forControlEvents:UIControlEventTouchUpInside]; 47 | [navBtn setBackgroundImage:[UIImage imageNamed:@"nav_back.png"] forState:UIControlStateNormal]; 48 | [navBtn setBackgroundImage:[UIImage imageNamed:@"nav_back.png"] forState:UIControlStateHighlighted]; 49 | navBtn.showsTouchWhenHighlighted = YES; 50 | UIBarButtonItem *btnItem = [[UIBarButtonItem alloc] initWithCustomView:navBtn]; 51 | self.navigationItem.leftBarButtonItem = btnItem; 52 | } 53 | 54 | #pragma mark - WebViewDelegate 55 | 56 | - (void)webViewDidFinishLoad:(UIWebView *)webView 57 | { 58 | [super webViewDidFinishLoad:webView]; 59 | [webView stringByEvaluatingJavaScriptFromString: 60 | @"document.body.removeChild(document.getElementById('header'));document.body.removeChild(document.getElementById('footer'));"]; 61 | 62 | if (! [[self.params allKeys] containsObject:@"title"] || 0 >= [self.params[@"title"] length]) { 63 | UILabel *label = [[UILabel alloc] initWithFrame:CGRectZero]; 64 | label.backgroundColor = [UIColor clearColor]; 65 | label.font = [UIFont boldSystemFontOfSize:20.0]; 66 | label.textAlignment = NSTextAlignmentCenter; 67 | label.textColor = RGBCOLOR(92.0f, 92.0f, 92.0f); 68 | label.text = [webView stringByEvaluatingJavaScriptFromString:@"document.title"]; 69 | [label sizeToFit]; 70 | self.navigationItem.titleView = label; 71 | } 72 | } 73 | 74 | - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType { 75 | // 如果是退出请求 http://segmentfault.com/user/logout ,拦截 76 | if ([@"segmentfault.com" isEqualToString:[request.URL host]] 77 | && [@"/user/logout" isEqualToString:[request.URL path]]) { 78 | return NO; 79 | } 80 | return YES; 81 | } 82 | 83 | #pragma mark 84 | 85 | - (void)viewDidLoad 86 | { 87 | [super viewDidLoad]; 88 | 89 | if (! [@"login" isEqualToString:[self.url host]] 90 | && 1 == [self.params[@"login"] intValue]) { 91 | [[NSNotificationCenter defaultCenter] removeObserver:self name:SFNotificationLogout object:nil]; 92 | [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(loadRequest) name:SFNotificationLogout object:nil]; 93 | } 94 | 95 | [[NSNotificationCenter defaultCenter] removeObserver:self name:UMNotificationWillShow object:nil]; 96 | [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(dismissKeyboard) name:UMNotificationWillShow object:nil]; 97 | 98 | self.view.backgroundColor = [UIColor whiteColor]; 99 | 100 | UILabel *label = [[UILabel alloc] initWithFrame:CGRectZero]; 101 | label.backgroundColor = [UIColor clearColor]; 102 | label.font = [UIFont boldSystemFontOfSize:20.0]; 103 | label.textAlignment = NSTextAlignmentCenter; 104 | label.textColor = RGBCOLOR(92.0f, 92.0f, 92.0f); 105 | 106 | if ([[self.params allKeys] containsObject:@"title"] && 0 < [self.params[@"title"] length]) { 107 | label.text = self.params[@"title"]; 108 | } 109 | else { 110 | label.text = @"Loading..."; 111 | } 112 | [label sizeToFit]; 113 | self.navigationItem.titleView = label; 114 | } 115 | 116 | @end 117 | -------------------------------------------------------------------------------- /SegmentFault/ViewControllers/Nav/SFSlideNavViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // SFSlideNavViewController.h 3 | // SegmentFault 4 | // 5 | // Created by jiajun on 11/26/12. 6 | // Copyright (c) 2012 SegmentFault.com. All rights reserved. 7 | // 8 | 9 | #import "UMSlideNavigationController.h" 10 | 11 | @interface SFSlideNavViewController : UMSlideNavigationController 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /SegmentFault/ViewControllers/Nav/SFSlideNavViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // SFSlideNavViewController.m 3 | // SegmentFault 4 | // 5 | // Created by jiajun on 11/26/12. 6 | // Copyright (c) 2012 SegmentFault.com. All rights reserved. 7 | // 8 | 9 | #import "SFLoginService.h" 10 | #import "SFSlideNavViewController.h" 11 | #import "UMNavigationController.h" 12 | #import "UMViewController.h" 13 | #import "SFAppDelegate.h" 14 | 15 | @interface SFSlideNavViewController () 16 | 17 | 18 | - (void)login; 19 | - (void)logout; 20 | 21 | // 记录ViewController已经被载入过 22 | @property (nonatomic, strong) NSMutableSet *loadedRootViewControllers; 23 | 24 | @end 25 | 26 | @implementation SFSlideNavViewController 27 | 28 | #pragma mark - private 29 | 30 | - (void)logout 31 | { 32 | [SFLoginService logout]; 33 | [self showItemAtIndex:[NSIndexPath indexPathForRow:0 inSection:0] withAnimation:YES]; 34 | 35 | [self.items[0] removeObject:[SFTools applicationDelegate].userProfileNavigator]; 36 | [self.items[0] removeObject:[SFTools applicationDelegate].followedQuestionsNavigator]; 37 | [self.items[0] removeObject:[SFTools applicationDelegate].logoutNavigator]; 38 | [self.items[0] removeObject:[SFTools applicationDelegate].loginNavigator]; 39 | 40 | [self.items[0] addObject:[SFTools applicationDelegate].loginNavigator]; 41 | 42 | [self.slideView reloadData]; 43 | } 44 | 45 | - (void)login 46 | { 47 | [self performSelector:@selector(slideButtonClicked) withObject:nil afterDelay:0.3f]; 48 | [self showItemAtIndex:[NSIndexPath indexPathForRow:0 inSection:0] withAnimation:NO]; 49 | 50 | [self.items[0] removeObject:[SFTools applicationDelegate].userProfileNavigator]; 51 | [self.items[0] removeObject:[SFTools applicationDelegate].followedQuestionsNavigator]; 52 | [self.items[0] removeObject:[SFTools applicationDelegate].logoutNavigator]; 53 | [self.items[0] removeObject:[SFTools applicationDelegate].loginNavigator]; 54 | 55 | [self.items[0] addObject:[SFTools applicationDelegate].followedQuestionsNavigator]; 56 | [self.items[0] addObject:[SFTools applicationDelegate].userProfileNavigator]; 57 | [self.items[0] addObject:[SFTools applicationDelegate].logoutNavigator]; 58 | 59 | [self.slideView reloadData]; 60 | } 61 | 62 | #pragma mark - UITableViewDataSource 63 | 64 | - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 65 | { 66 | return [self.items[section] count]; 67 | } 68 | 69 | - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 70 | { 71 | return [self.items count]; 72 | } 73 | 74 | - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 75 | { 76 | static NSString *CellIdentifier = @"UMSlideNavigationControllerSlideViewCell"; 77 | UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 78 | 79 | if (cell == nil) { 80 | cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier]; 81 | 82 | UIImageView *bg = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"nav_cell_bg.png"]]; 83 | UIImageView *chevron = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"nav_cell_arrow.png"]];; 84 | 85 | bg.frame = CGRectMake(0.0f, 0.0f, 320.0f, CELL_HEIGHT); 86 | chevron.frame = CGRectMake(235.0f, 14.0f, 15.0f, 15.0f); 87 | [bg addSubview:chevron]; 88 | cell.backgroundView = bg; 89 | 90 | UIImageView *selectedBg = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"nav_cell_bg_active.png"]]; 91 | selectedBg.frame = CGRectMake(0.0f, 0.0f, 320.0f, CELL_HEIGHT); 92 | UIImageView *selectedChevron = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"nav_cell_arrow_active.png"]]; 93 | selectedChevron.frame = CGRectMake(235.0f, 14.0f, 15.0f, 15.0f); 94 | [selectedBg addSubview:selectedChevron]; 95 | cell.selectedBackgroundView = selectedBg; 96 | 97 | cell.textLabel.font = [UIFont boldSystemFontOfSize:18.0f]; 98 | cell.textLabel.backgroundColor = [UIColor clearColor]; 99 | cell.textLabel.shadowColor = [UIColor blackColor]; 100 | cell.textLabel.shadowOffset = CGSizeMake(0.0f, -1.0f); 101 | } 102 | 103 | cell.textLabel.text = [(UIViewController *)self.items[indexPath.section][indexPath.row] title]; 104 | 105 | [tableView selectRowAtIndexPath:self.currentIndex animated:NO scrollPosition:UITableViewRowAnimationTop]; 106 | if ([indexPath isEqual:self.currentIndex]) { 107 | cell.textLabel.textColor = [UIColor whiteColor]; 108 | } 109 | else { 110 | cell.textLabel.textColor = RGBCOLOR(187, 187, 187); 111 | } 112 | 113 | return cell; 114 | } 115 | 116 | #pragma mark - UITableViewDelegate 117 | 118 | - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 119 | { 120 | return CELL_HEIGHT; 121 | } 122 | 123 | - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 124 | { 125 | if ([SFLoginService isLogin] 126 | && [self.items[indexPath.section][indexPath.row] isEqual:[SFTools applicationDelegate].logoutNavigator]) { 127 | [self logout]; 128 | } 129 | else { 130 | [self showItemAtIndex:indexPath withAnimation:YES]; 131 | UMNavigationController *currentNav = (UMNavigationController *)self.items[indexPath.section][indexPath.row]; 132 | UMViewController *currentVC = (UMViewController *)[[currentNav viewControllers] lastObject]; 133 | if ([indexPath isEqual:self.currentIndex]) { 134 | [currentVC viewDidLoad]; 135 | } 136 | } 137 | 138 | UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath]; 139 | cell.textLabel.textColor = [UIColor whiteColor]; 140 | } 141 | 142 | - (void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath { 143 | UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath]; 144 | cell.textLabel.textColor = RGBCOLOR(187, 187, 187); 145 | } 146 | 147 | #pragma mark 148 | 149 | - (void)viewDidLoad 150 | { 151 | [super viewDidLoad]; 152 | 153 | self.slideView.dataSource = self; 154 | self.slideView.delegate = self; 155 | self.slideView.separatorStyle = UITableViewCellSeparatorStyleNone; 156 | self.slideView.backgroundColor = RGBCOLOR(51, 51, 51); 157 | 158 | self.slideView.tableHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, self.slideView.width, 64.0f)]; 159 | UILabel *segment = [[UILabel alloc] initWithFrame:CGRectMake(15.0f, 15.0f, 230.0f, 30.0f)]; 160 | segment.backgroundColor = [UIColor clearColor]; 161 | segment.font = [UIFont boldSystemFontOfSize:28.0f]; 162 | segment.textColor = [UIColor whiteColor]; 163 | segment.shadowOffset = CGSizeMake(0.0f, 1.0f); 164 | segment.shadowColor = [UIColor blackColor]; 165 | segment.text = @"segment"; 166 | [segment sizeToFit]; 167 | [self.slideView.tableHeaderView addSubview:segment]; 168 | UILabel *fault = [[UILabel alloc] initWithFrame:CGRectMake(segment.right, segment.top, 230.0f, 34.0f)]; 169 | fault.backgroundColor = [UIColor clearColor]; 170 | fault.font = [UIFont boldSystemFontOfSize:28.0f]; 171 | fault.textColor = RGBCOLOR(0, 153, 101); 172 | fault.shadowOffset = CGSizeMake(0.0f, 1.0f); 173 | fault.shadowColor = [UIColor blackColor]; 174 | fault.text = @"fault"; 175 | [fault sizeToFit]; 176 | [self.slideView.tableHeaderView addSubview:fault]; 177 | 178 | self.slideView.tableFooterView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"nav_cell_bg.png"]]; 179 | 180 | if (nil == self.loadedRootViewControllers) { 181 | self.loadedRootViewControllers = [[NSMutableSet alloc] initWithObjects:self.items[self.currentIndex.section][self.currentIndex.row], nil]; 182 | } 183 | } 184 | 185 | @end 186 | -------------------------------------------------------------------------------- /SegmentFault/ViewControllers/SFLoginViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // SFLoginViewController.h 3 | // SegmentFault 4 | // 5 | // Created by jiajun on 12/13/12. 6 | // Copyright (c) 2012 SegmentFault.com. All rights reserved. 7 | // 8 | 9 | #import "SFWebViewController.h" 10 | 11 | @interface SFLoginViewController : SFWebViewController 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /SegmentFault/ViewControllers/SFLoginViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // SFLoginViewController.m 3 | // SegmentFault 4 | // 5 | // Created by jiajun on 12/13/12. 6 | // Copyright (c) 2012 SegmentFault.com. All rights reserved. 7 | // 8 | 9 | #import "SFLoginService.h" 10 | #import "SFLoginViewController.h" 11 | #import "SFAppDelegate.h" 12 | #import "SFSlideNavViewController.h" 13 | 14 | @interface SFLoginViewController () 15 | 16 | - (void)login; 17 | 18 | @end 19 | 20 | @implementation SFLoginViewController 21 | 22 | #pragma mark - private 23 | 24 | - (void)login 25 | { 26 | // 调用SlideNavigator,刷新导航栏目 27 | [[SFTools applicationDelegate].navigator performSelector:@selector(login)]; 28 | } 29 | 30 | #pragma mark - UIWebViewDelegate 31 | 32 | - (void)webViewDidStartLoad:(UIWebView *)webView 33 | { 34 | [self reloadToolBar]; 35 | self.webView.alpha = 0.0f; 36 | } 37 | 38 | - (void)webViewDidFinishLoad:(UIWebView *)webView 39 | { 40 | NSMutableDictionary *loginInfo = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"400", @"status", nil]; 41 | NSHTTPCookie *cookie; 42 | for (cookie in [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookies]) { 43 | if ([@"sfuid" isEqualToString:cookie.name] && 0 < cookie.value.length) { 44 | [loginInfo setValue:cookie.value forKey:@"sfuid"]; 45 | [loginInfo setValue:@"0" forKey:@"status"]; 46 | } 47 | else if ([@"sfsess" isEqualToString:cookie.name]) { 48 | [loginInfo setValue:cookie.value forKey:@"sfsess"]; 49 | } 50 | } 51 | 52 | if (loginInfo && 0 == [loginInfo[@"status"] intValue]) { 53 | if ([SFLoginService loginWithInfo:loginInfo]) { 54 | if (nil != self.params[@"callback"]) { 55 | __weak UMViewController *lastViewController = self.navigator.viewControllers [(self.navigator.viewControllers.count > 1) 56 | ? (self.navigator.viewControllers.count - 2) : 0]; 57 | SEL callback = NSSelectorFromString(self.params[@"callback"]); 58 | if (lastViewController && callback && [lastViewController respondsToSelector:callback]) { 59 | [lastViewController performSelector:callback withObject:nil afterDelay:0.5f]; 60 | } 61 | } 62 | else { 63 | [self login]; 64 | } 65 | [self.navigator popViewControllerAnimated:YES]; 66 | } 67 | else { 68 | [SFLoginService logout]; 69 | [self loadRequest]; 70 | self.webView.alpha = 1.0f; 71 | } 72 | } 73 | else { 74 | self.webView.alpha = 1.0f; 75 | } 76 | [super webViewDidFinishLoad:webView]; 77 | } 78 | 79 | #pragma mark 80 | 81 | - (void)viewDidLoad 82 | { 83 | self.url = [NSURL URLWithString:@"http://segmentfault.com/user/login"]; 84 | [super viewDidLoad]; 85 | 86 | self.webView.autoresizingMask = (UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth); 87 | self.webView.multipleTouchEnabled = NO; 88 | self.webView.scalesPageToFit = NO; 89 | self.webView.delegate = self; 90 | self.webView.autoresizesSubviews = YES; 91 | } 92 | 93 | @end 94 | -------------------------------------------------------------------------------- /SegmentFault/ViewControllers/SFQuestionDetailViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // SFQuestionDetailViewController.h 3 | // SegmentFault 4 | // 5 | // Created by jiajun on 12/12/12. 6 | // Copyright (c) 2012 SegmentFault.com. All rights reserved. 7 | // 8 | 9 | #import "SFRootViewController.h" 10 | 11 | @interface SFQuestionDetailViewController : SFRootViewController 12 | 13 | @property (strong, nonatomic) NSDictionary *questionInfo; 14 | 15 | @end 16 | -------------------------------------------------------------------------------- /SegmentFault/ViewControllers/SFQuestionDetailViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // SFQuestionDetailViewController.m 3 | // SegmentFault 4 | // 5 | // Created by jiajun on 12/12/12. 6 | // Copyright (c) 2012 SegmentFault.com. All rights reserved. 7 | // 8 | 9 | #import "SFLabel.h" 10 | #import "SFLocalWebView.h" 11 | #import "SFQuestionDetailViewController.h" 12 | #import "SFQuestionService.h" 13 | #import "SRRefreshView.h" 14 | 15 | @interface SFQuestionDetailViewController () 16 | 17 | 18 | @property (strong, nonatomic) SFLocalWebView *answerView; 19 | @property (strong, nonatomic) UIActivityIndicatorView *indicator; 20 | @property (strong, nonatomic) NSString *questionId; 21 | @property (strong, nonatomic) SFLocalWebView *questionView; 22 | @property (strong, nonatomic) UITableView *tableView; 23 | @property (strong, nonatomic) UIView *tagsContainer; 24 | @property (strong, nonatomic) SFLabel *titleLabel; 25 | 26 | - (void)reloadData; 27 | 28 | @end 29 | 30 | @implementation SFQuestionDetailViewController 31 | 32 | #pragma mark - private 33 | 34 | - (void)reloadData 35 | { 36 | if (nil == self.questionView) { 37 | self.questionView = [[SFLocalWebView alloc] initWithFrame:CGRectMake(10.0f, self.titleLabel.bottom, 300.0f, 44.0f)]; 38 | self.questionView.navigator = self.navigator; 39 | NSString*filePath=[[NSBundle mainBundle] pathForResource:@"QuestionDetail.html" ofType:@"txt"]; 40 | NSString *detailHTML = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil]; 41 | [self.questionView loadHTMLString:[NSString stringWithFormat:detailHTML, self.questionInfo[@"question"]] baseURL:nil]; 42 | } 43 | if (nil == self.answerView) { 44 | self.answerView = [[SFLocalWebView alloc] initWithFrame:CGRectMake(10.0f, self.questionView.bottom + SECTION_HEADER_HEIGHT, 300.0f, 44.0f)]; 45 | self.answerView.navigator = self.navigator; 46 | NSString*filePath=[[NSBundle mainBundle] pathForResource:@"AnswerDetail.html" ofType:@"txt"]; 47 | NSString *detailHTML = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil]; 48 | [self.answerView loadHTMLString:[NSString stringWithFormat:detailHTML, self.questionInfo[@"answers"]] baseURL:nil]; 49 | } 50 | 51 | self.questionView.top = self.titleLabel.bottom + 10.0f; 52 | [self.tableView insertSubview:self.questionView atIndex:2]; 53 | self.answerView.top = self.questionView.bottom + SECTION_HEADER_HEIGHT; 54 | [self.tableView insertSubview:self.answerView atIndex:3]; 55 | [self.tableView reloadData]; 56 | } 57 | 58 | #pragma mark - UITableViewDatasource 59 | 60 | - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 61 | { 62 | return 2; 63 | } 64 | 65 | - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 66 | { 67 | return 1; 68 | } 69 | 70 | - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 71 | { 72 | UITableViewCell *cell = nil; 73 | static NSString *cellIndentifier = @"SFQuestoinDetailCell"; 74 | cell = [tableView dequeueReusableCellWithIdentifier:cellIndentifier]; 75 | if (nil == cell) { 76 | cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIndentifier]; 77 | cell.selectionStyle = UITableViewCellSelectionStyleNone; 78 | } 79 | 80 | return cell; 81 | } 82 | 83 | - (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section 84 | { 85 | if (1 == section) { 86 | UIImageView *bg = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"question_list_header_bg.png"]]; 87 | bg.frame = CGRectMake(0.0f, 0.0f, 320.0f, SECTION_HEADER_HEIGHT); 88 | UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(10.0f, 0.0f, 300.0f, SECTION_HEADER_HEIGHT)]; 89 | label.backgroundColor = [UIColor clearColor]; 90 | label.textColor = RGBCOLOR(44.0f, 44.0f, 44.0f); 91 | if (1 == section) { 92 | label.font = [UIFont boldSystemFontOfSize:15.0f]; 93 | label.text = [NSString stringWithFormat:@"%@ 答案", self.params[@"answers"]]; 94 | } 95 | label.shadowColor = [UIColor whiteColor]; 96 | label.shadowOffset = CGSizeMake(0.0f, 1.0f); 97 | 98 | [bg addSubview:label]; 99 | return (UIView *)bg; 100 | } 101 | return nil; 102 | } 103 | 104 | #pragma mark - UITableViewDelegate 105 | 106 | - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section 107 | { 108 | if (1 == section) { 109 | return SECTION_HEADER_HEIGHT; 110 | } 111 | return 0; 112 | } 113 | 114 | - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 115 | { 116 | if (0 == indexPath.section && 0 == indexPath.row) { 117 | if (self.questionView && 0.0f < self.questionView.height) { 118 | return self.questionView.height + 20.0f + self.titleLabel.bottom; 119 | } 120 | } 121 | else if (1 == indexPath.section && 0 == indexPath.row) { 122 | if (self.answerView && 0.0f < self.answerView.height) { 123 | return self.answerView.height + 10.0f; 124 | } 125 | } 126 | 127 | return self.titleLabel.bottom + 10.0f; 128 | } 129 | 130 | #pragma mark 131 | 132 | - (void)viewDidLoad 133 | { 134 | [super viewDidLoad]; 135 | 136 | if (nil == self.tableView) { 137 | self.tableView = [[UITableView alloc] initWithFrame:self.view.bounds style:UITableViewStylePlain]; 138 | self.tableView.height -= 44.0f; 139 | self.tableView.dataSource = self; 140 | self.tableView.delegate = self; 141 | self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone; 142 | [self.view addSubview:self.tableView]; 143 | } 144 | 145 | if (nil == self.indicator) { 146 | self.indicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray]; 147 | self.indicator.frame = CGRectMake(self.tableView.width / 2 - 20.0f, self.tableView.height / 2 - 60.0f, 40.0f, 40.0f); 148 | [self.view addSubview:self.indicator]; 149 | [self.indicator startAnimating]; 150 | } 151 | 152 | if (nil == self.tagsContainer) { 153 | self.tagsContainer = [[UIView alloc] initWithFrame:CGRectMake(10.0f, 10.0f, 300.0f, 17.0f)]; 154 | 155 | for (NSString *tag in (NSArray *)self.query[@"tags"]) { 156 | SFLabel *label = [[SFLabel alloc] initWithInsets:UIEdgeInsetsMake(1.0f, 4.0f, 1.0f, 4.0f)]; 157 | label.backgroundColor = RGBCOLOR(187, 187, 187); 158 | label.textAlignment = NSTextAlignmentCenter; 159 | label.textColor = [UIColor whiteColor]; 160 | label.font = TAG_LABEL_FONT; 161 | label.layer.cornerRadius = 2.0f; 162 | label.text = tag; 163 | [label sizeToFit]; 164 | 165 | if (0 < [self.tagsContainer.subviews count]) { 166 | label.left = [(UIView *)self.tagsContainer.subviews.lastObject right] + 2.0f; 167 | } 168 | else { 169 | label.left = 0.0f; 170 | } 171 | // Label太长就跳过 172 | if (self.tagsContainer.width < label.right) { 173 | continue; 174 | } 175 | [self.tagsContainer addSubview:label]; 176 | } 177 | 178 | [self.tableView addSubview:self.tagsContainer]; 179 | } 180 | 181 | if (nil == self.titleLabel) { 182 | self.titleLabel = [[SFLabel alloc] initWithFrame:CGRectMake(10.0f, self.tagsContainer.bottom + 14.0f, 300.0f, 17.0f)]; 183 | self.titleLabel.numberOfLines = 0; 184 | self.titleLabel.font = QUESTION_TITLE_LABEL_FONT; 185 | self.titleLabel.text = self.params[@"qtitle"]; 186 | self.titleLabel.height = [SFTools heightOfString:self.titleLabel.text 187 | withWidth:292.0f 188 | font:QUESTION_TITLE_LABEL_FONT]; 189 | [self.tableView addSubview:self.titleLabel]; 190 | } 191 | 192 | [SFQuestionService getQuestionDetailById:self.params[@"qid"] withBlock:^(NSDictionary *questionInfo, NSInteger answers, NSError *error){ 193 | self.questionInfo = questionInfo; 194 | [self reloadData]; 195 | [self.indicator removeFromSuperview]; 196 | self.indicator = nil; 197 | }]; 198 | 199 | [[NSNotificationCenter defaultCenter] removeObserver:self name:SFNotificationAnswerLoaded object:nil]; 200 | [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reloadData) name:SFNotificationAnswerLoaded object:nil]; 201 | 202 | [[NSNotificationCenter defaultCenter] removeObserver:self name:SFNotificationQuestionLoaded object:nil]; 203 | [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reloadData) name:SFNotificationQuestionLoaded object:nil]; 204 | } 205 | 206 | @end 207 | -------------------------------------------------------------------------------- /SegmentFault/ViewControllers/SFQuestionListViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // SFQuestionListViewController.h 3 | // SegmentFault 4 | // 5 | // Created by jiajun on 11/29/12. 6 | // Copyright (c) 2012 SegmentFault.com. All rights reserved. 7 | // 8 | 9 | #import "SFRootViewController.h" 10 | 11 | @interface SFQuestionListViewController : SFRootViewController 12 | 13 | @property (strong, nonatomic) NSMutableArray *questionList; 14 | 15 | @end 16 | -------------------------------------------------------------------------------- /SegmentFault/ViewControllers/SFQuestionListViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // SFQuestionListViewController.m 3 | // SegmentFault 4 | // 5 | // Created by jiajun on 11/29/12. 6 | // Copyright (c) 2012 SegmentFault.com. All rights reserved. 7 | // 8 | 9 | #import "SFQuestionListViewController.h" 10 | #import "SFQuestionService.h" 11 | #import "SRRefreshView.h" 12 | #import "SFQuestionListCell.h" 13 | 14 | @interface SFQuestionListViewController () 15 | 16 | 17 | - (void)appendQuestions:(NSArray *)questions; 18 | - (void)didLogout; 19 | 20 | @property (assign, nonatomic) BOOL hasMore; 21 | @property (assign, nonatomic) BOOL loading; 22 | @property (strong, nonatomic) NSString *list; 23 | @property (assign, nonatomic) NSInteger page; 24 | @property (strong, nonatomic) UITableView *tableView; 25 | @property (strong, nonatomic) SRRefreshView *slimeView; 26 | 27 | @end 28 | 29 | @implementation SFQuestionListViewController 30 | 31 | #pragma mark - private 32 | 33 | // 把问题接在后边 34 | - (void)appendQuestions:(NSArray *)questions 35 | { 36 | self.hasMore = YES; 37 | if (nil != questions) { 38 | if (30 > [questions count]) { 39 | self.hasMore = NO; 40 | } 41 | if (nil == self.questionList) { 42 | self.questionList = [[NSMutableArray alloc] initWithArray:questions]; 43 | } 44 | else { 45 | [self.questionList addObjectsFromArray:questions]; 46 | } 47 | } 48 | self.loading = NO; 49 | [self.tableView reloadData]; 50 | } 51 | 52 | - (void)didLogout 53 | { 54 | [self.questionList removeAllObjects]; 55 | [self.tableView reloadData]; 56 | [self.navigator popToRootViewControllerAnimated:NO]; 57 | } 58 | 59 | #pragma mark - UITableViewDataSource 60 | 61 | - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 62 | { 63 | SFQuestionListCell *cell; 64 | 65 | if (indexPath.row < [self.questionList count]) { 66 | cell = [tableView questionListCell]; 67 | [cell updateQuestionInfo:self.questionList[indexPath.row]]; 68 | } 69 | else { 70 | cell = [tableView questionListLoadingCell]; 71 | if (! self.loading && self.hasMore) { 72 | self.page ++; 73 | [SFQuestionService getQuestionList:self.list onPage:self.page withBlock:^(NSArray *questions, NSError *error) { 74 | if (5 == error.code) { 75 | ;; 76 | } else if (0 == error.code) { 77 | [self appendQuestions:questions]; 78 | } 79 | }]; 80 | self.loading = YES; 81 | } 82 | } 83 | 84 | return (UITableViewCell *)cell; 85 | } 86 | 87 | #pragma mark - UITableViewDelegate 88 | 89 | - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 90 | { 91 | if (indexPath.row < [self.questionList count]) { 92 | CGFloat height = [SFTools heightOfString:self.questionList[indexPath.row][@"title"] 93 | withWidth:292.0f 94 | font:QUESTION_TITLE_LABEL_FONT]; 95 | return height + 47.0f; 96 | } 97 | else { 98 | return 60.0f; 99 | } 100 | } 101 | 102 | - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 103 | { 104 | [tableView deselectRowAtIndexPath:indexPath animated:YES]; 105 | [self.navigator openURL:[[NSURL URLWithString:@"sf://questiondetail"] addParams:[NSDictionary dictionaryWithObjectsAndKeys: 106 | self.questionList[indexPath.row][@"id"], @"qid", 107 | @"问题详情", @"title", 108 | self.questionList[indexPath.row][@"title"], @"qtitle", 109 | self.questionList[indexPath.row][@"answersWord"], @"answers", 110 | nil]] 111 | withQuery:[NSDictionary dictionaryWithObjectsAndKeys:self.questionList[indexPath.row][@"tags"], @"tags" ,nil]]; 112 | } 113 | 114 | - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 115 | { 116 | return self.hasMore && 0 < [self.questionList count] ? [self.questionList count] + 1 : [self.questionList count]; 117 | } 118 | 119 | #pragma mark - UIScrollViewDelegate 120 | 121 | - (void)scrollViewDidScroll:(UIScrollView *)scrollView 122 | { 123 | [self.slimeView scrollViewDidScroll]; 124 | } 125 | 126 | - (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate 127 | { 128 | [self.slimeView scrollViewDidEndDraging]; 129 | } 130 | 131 | #pragma mark - slimeRefresh delegate 132 | 133 | - (void)slimeRefreshStartRefresh:(SRRefreshView *)refreshView 134 | { 135 | self.page = 1; 136 | if (! self.loading) { 137 | [SFQuestionService getQuestionList:self.list onPage:self.page withBlock:^(NSArray *questions, NSError *error) { 138 | [self.questionList removeAllObjects]; 139 | if (5 == error.code) { 140 | ;; 141 | } else if (0 == error.code) { 142 | [self appendQuestions:questions]; 143 | } 144 | [self.slimeView endRefresh]; 145 | }]; 146 | } 147 | } 148 | 149 | #pragma mark 150 | 151 | - (void)viewDidLoad 152 | { 153 | [super viewDidLoad]; 154 | self.list = [[self.params allKeys] containsObject:@"list"] ? self.params[@"list"] : @"listnewest"; 155 | if (nil == self.tableView) { 156 | self.tableView = [[UITableView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, self.view.width, self.view.height - 44.0f) 157 | style:UITableViewStylePlain]; 158 | 159 | self.tableView.backgroundColor = RGBCOLOR(244, 244, 244); 160 | self.tableView.separatorColor = [UIColor clearColor]; 161 | self.tableView.dataSource = self; 162 | self.tableView.delegate = self; 163 | 164 | self.slimeView = [[SRRefreshView alloc] init]; 165 | self.slimeView.delegate = self; 166 | self.slimeView.slimeMissWhenGoingBack = YES; 167 | self.slimeView.slime.bodyColor = RGBCOLOR(0, 154, 103); // 换成SF绿 168 | self.slimeView.slime.skinColor = RGBCOLOR(0, 154, 103); // 换成SF绿 169 | [self.tableView addSubview:_slimeView]; 170 | 171 | [self.view addSubview:self.tableView]; 172 | } 173 | 174 | self.page = 1; 175 | [self.slimeView setLoadingWithexpansion]; 176 | [SFQuestionService getQuestionList:self.list onPage:self.page withBlock:^(NSArray *questions, NSError *error) { 177 | if (5 == error.code) { 178 | ;; // 没权限 179 | } else if (0 == error.code) { 180 | [self.questionList removeAllObjects]; 181 | [self appendQuestions:questions]; 182 | } 183 | [self.slimeView endRefresh]; 184 | }]; 185 | self.loading = YES; 186 | self.hasMore = YES; 187 | } 188 | 189 | @end 190 | -------------------------------------------------------------------------------- /SegmentFault/Views/Cells/SFQuestionListCell.h: -------------------------------------------------------------------------------- 1 | // 2 | // SFQuestionListCell.h 3 | // SegmentFault 4 | // 5 | // Created by jiajun on 2/28/13. 6 | // Copyright (c) 2013 SegmentFault.com. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface SFQuestionListCell : UITableViewCell 12 | 13 | - (void)updateQuestionInfo:(NSDictionary *)info; 14 | 15 | @end 16 | 17 | @interface UITableView (SFQuestionListTableView) 18 | 19 | - (SFQuestionListCell *)questionListCell; 20 | - (SFQuestionListCell *)questionListLoadingCell; 21 | 22 | @end 23 | -------------------------------------------------------------------------------- /SegmentFault/Views/Cells/SFQuestionListCell.m: -------------------------------------------------------------------------------- 1 | // 2 | // SFQuestionListCell.m 3 | // SegmentFault 4 | // 5 | // Created by jiajun on 2/28/13. 6 | // Copyright (c) 2013 SegmentFault.com. All rights reserved. 7 | // 8 | 9 | #import "SFQuestionListCell.h" 10 | #import "SFLabel.h" 11 | 12 | @interface SFQuestionListCell () 13 | 14 | @property (nonatomic, strong) SFLabel *answersLabel; 15 | @property (nonatomic, strong) UIImageView *cellSeparator; 16 | @property (nonatomic, strong) NSMutableSet *labelPool; 17 | @property (nonatomic, strong) UIView *tagsContainer; 18 | @property (nonatomic, strong) SFLabel *titleLabel; 19 | @property (nonatomic, strong) UIImageView *voteIcon; 20 | @property (nonatomic, strong) SFLabel *voteNumber; 21 | 22 | @end 23 | 24 | @implementation SFQuestionListCell 25 | 26 | - (void)updateQuestionInfo:(NSDictionary *)info 27 | { 28 | self.titleLabel.text = info[@"title"]; 29 | self.titleLabel.height = [SFTools heightOfString:self.titleLabel.text 30 | withWidth:292.0f 31 | font:QUESTION_TITLE_LABEL_FONT]; 32 | 33 | if ([@"0" isEqualToString:info[@"answersWord"]]) { 34 | self.answersLabel.backgroundColor = RGBCOLOR(159, 66, 69); 35 | } 36 | else { 37 | self.answersLabel.backgroundColor = RGBCOLOR(0, 154, 103); 38 | } 39 | self.answersLabel.text = [NSString stringWithFormat:@"%@ answer", info[@"answersWord"]]; 40 | [self.answersLabel sizeToFit]; 41 | self.answersLabel.top = self.titleLabel.bottom + 5.0f; 42 | 43 | self.tagsContainer.top = self.answersLabel.top; 44 | self.tagsContainer.left = self.answersLabel.right + 2.0f; 45 | self.tagsContainer.width = 240.0f - self.tagsContainer.left; 46 | for (UIView *tagLabel in self.tagsContainer.subviews) { 47 | [self.labelPool addObject:tagLabel]; 48 | [tagLabel removeFromSuperview]; 49 | } 50 | 51 | for (NSString *tag in (NSArray *)info[@"tags"]) { 52 | // 先到Pool里取,没有再新建 53 | SFLabel *label = (SFLabel *)[self.labelPool anyObject]; 54 | if (nil == label) { 55 | label = [[SFLabel alloc] initWithInsets:UIEdgeInsetsMake(1.0f, 4.0f, 1.0f, 4.0f)]; 56 | label.backgroundColor = RGBCOLOR(187, 187, 187); 57 | label.textAlignment = NSTextAlignmentCenter; 58 | label.textColor = [UIColor whiteColor]; 59 | label.font = TAG_LABEL_FONT; 60 | label.layer.cornerRadius = 2.0f; 61 | } 62 | else { 63 | [self.labelPool removeObject:label]; 64 | } 65 | label.text = tag; 66 | [label sizeToFit]; 67 | 68 | if (0 < [self.tagsContainer.subviews count]) { 69 | label.left = [(UIView *)self.tagsContainer.subviews.lastObject right] + 2.0f; 70 | } 71 | else { 72 | label.left = 0.0f; 73 | } 74 | // Label太长就跳过 75 | if (self.tagsContainer.width < label.right) { 76 | continue; 77 | } 78 | [self.tagsContainer addSubview:label]; 79 | } 80 | 81 | self.voteIcon.top = self.titleLabel.bottom + 10.0f; 82 | 83 | self.voteNumber.text = info[@"votes"]; 84 | [self.voteNumber sizeToFit]; 85 | self.voteNumber.top = self.voteIcon.top - 2.0f; 86 | 87 | self.cellSeparator.top = self.tagsContainer.bottom + 10.0f; 88 | } 89 | 90 | @end 91 | 92 | @implementation UITableView (SFQuestionListTableView) 93 | 94 | - (SFQuestionListCell *)questionListCell 95 | { 96 | static NSString *CellIdentifier = @"SegmentFaultQuestionListCell"; 97 | SFQuestionListCell *cell = (SFQuestionListCell *)[self dequeueReusableCellWithIdentifier:CellIdentifier]; 98 | 99 | if (cell == nil) { 100 | cell = [[SFQuestionListCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier]; 101 | cell.backgroundColor = RGBCOLOR(244, 244, 244); 102 | 103 | cell.selectedBackgroundView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"qlist_cell_selected_background.png"]]; 104 | 105 | cell.labelPool = [[NSMutableSet alloc] init]; 106 | 107 | cell.titleLabel = [[SFLabel alloc] initWithFrame:CGRectMake(14.0f, 12.0f, 292.0f, 15.0f)]; 108 | cell.titleLabel.numberOfLines = 0; 109 | cell.titleLabel.font = QUESTION_TITLE_LABEL_FONT; 110 | cell.titleLabel.backgroundColor = RGBCOLOR(244, 244, 244); 111 | [cell.contentView addSubview:cell.titleLabel]; 112 | 113 | cell.answersLabel = [[SFLabel alloc] initWithFrame:CGRectMake(14.0f, 4.0f, 40.0f, 17.0f) 114 | andInsets:UIEdgeInsetsMake(1.0f, 4.0f, 1.0f, 4.0f)]; 115 | cell.answersLabel.backgroundColor = RGBCOLOR(0, 154, 103); 116 | cell.answersLabel.textAlignment = NSTextAlignmentCenter; 117 | cell.answersLabel.textColor = [UIColor whiteColor]; 118 | cell.answersLabel.font = TAG_LABEL_FONT; 119 | cell.answersLabel.layer.cornerRadius = 2.0f; 120 | [cell.contentView addSubview:cell.answersLabel]; 121 | 122 | cell.tagsContainer = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 4.0f, 200.0f, 17.0f)]; 123 | cell.tagsContainer.backgroundColor = RGBCOLOR(244, 244, 244); 124 | [cell.contentView addSubview:cell.tagsContainer]; 125 | 126 | cell.voteIcon = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"question_list_vote.png"]]; 127 | cell.voteIcon.left = 270.0f; 128 | cell.voteIcon.top = cell.answersLabel.top + 2.0f; 129 | [cell.contentView addSubview:cell.voteIcon]; 130 | 131 | cell.voteNumber = [[SFLabel alloc] initWithFrame:CGRectMake(cell.voteIcon.right + 5.0f, cell.voteIcon.top, 2.0f, 2.0f)]; 132 | cell.voteNumber.backgroundColor = RGBCOLOR(244, 244, 244); 133 | cell.voteNumber.textColor = RGBCOLOR(153.0f, 153.0f, 153.0f); 134 | cell.voteNumber.font = [UIFont systemFontOfSize:14.0f]; 135 | [cell.contentView addSubview:cell.voteNumber]; 136 | 137 | cell.cellSeparator = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"question_list_cell_sep.png"]]; 138 | [cell.contentView addSubview:cell.cellSeparator]; 139 | } 140 | 141 | return cell; 142 | } 143 | 144 | - (SFQuestionListCell *)questionListLoadingCell 145 | { 146 | static NSString *CellIdentifier = @"SegmentFaultQuestionLoadingCell"; 147 | SFQuestionListCell *cell = (SFQuestionListCell *)[self dequeueReusableCellWithIdentifier:CellIdentifier]; 148 | if (cell == nil) { 149 | cell = [[SFQuestionListCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; 150 | cell.backgroundColor = RGBCOLOR(244, 244, 244); 151 | 152 | cell.accessoryType = UITableViewCellAccessoryNone; 153 | cell.textLabel.text = @"Loading ..."; 154 | cell.textLabel.numberOfLines = 1; 155 | cell.textLabel.font = QUESTION_TITLE_LABEL_FONT; 156 | } 157 | return cell; 158 | } 159 | 160 | @end 161 | -------------------------------------------------------------------------------- /SegmentFault/Views/SFLabel.h: -------------------------------------------------------------------------------- 1 | // 2 | // SFLabel.h 3 | // SegmentFault 4 | // 5 | // Created by jiajun on 3/1/13. 6 | // Copyright (c) 2013 SegmentFault.com. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface SFLabel : UILabel 12 | 13 | -(id) initWithFrame:(CGRect)frame andInsets: (UIEdgeInsets) insets; 14 | -(id) initWithInsets: (UIEdgeInsets) insets; 15 | 16 | @property(nonatomic) UIEdgeInsets insets; 17 | 18 | @end -------------------------------------------------------------------------------- /SegmentFault/Views/SFLabel.m: -------------------------------------------------------------------------------- 1 | // 2 | // SFLabel.m 3 | // SegmentFault 4 | // 5 | // Created by jiajun on 3/1/13. 6 | // Copyright (c) 2013 SegmentFault.com. All rights reserved. 7 | // 8 | 9 | #import "SFLabel.h" 10 | 11 | @implementation SFLabel 12 | 13 | @synthesize insets = _insets; 14 | 15 | -(id) initWithFrame:(CGRect)frame andInsets:(UIEdgeInsets)insets { 16 | self = [super initWithFrame:frame]; 17 | if(self){ 18 | self.insets = insets; 19 | } 20 | return self; 21 | } 22 | 23 | -(id) initWithInsets:(UIEdgeInsets)insets { 24 | self = [super init]; 25 | if(self){ 26 | self.insets = insets; 27 | } 28 | return self; 29 | } 30 | 31 | - (void)sizeToFit { 32 | [super sizeToFit]; 33 | self.width = self.width + self.insets.right + self.insets.left; 34 | self.height = self.height + self.insets.top + self.insets.bottom; 35 | } 36 | 37 | @end 38 | -------------------------------------------------------------------------------- /SegmentFault/Views/SFLocalWebView.h: -------------------------------------------------------------------------------- 1 | // 2 | // SFLocalWebView.h 3 | // SegmentFault 4 | // 5 | // Created by jiajun on 1/13/13. 6 | // Copyright (c) 2013 SegmentFault.com. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @class UMNavigationController; 12 | 13 | @interface SFLocalWebView : UIWebView 14 | 15 | @property (assign, nonatomic) SFQuestionCellType type; 16 | @property (unsafe_unretained, nonatomic) UMNavigationController *navigator; 17 | 18 | @end 19 | -------------------------------------------------------------------------------- /SegmentFault/Views/SFLocalWebView.m: -------------------------------------------------------------------------------- 1 | // 2 | // SFLocalWebView.m 3 | // SegmentFault 4 | // 5 | // Created by jiajun on 1/13/13. 6 | // Copyright (c) 2013 SegmentFault.com. All rights reserved. 7 | // 8 | 9 | #import "SFLocalWebView.h" 10 | #import "UMNavigationController.h" 11 | 12 | @interface SFLocalWebView () 13 | 14 | 15 | @end 16 | 17 | @implementation SFLocalWebView 18 | 19 | #pragma mark - UIWebViewDelegate 20 | 21 | - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType 22 | { 23 | if ([request.URL.absoluteString containsString:@"http://"] 24 | || [request.URL.absoluteString containsString:@"https://"]) { 25 | [self.navigator openURL:[[NSURL URLWithString:@"sf://webview"] 26 | addParams:[NSDictionary dictionaryWithObjectsAndKeys: 27 | request.URL.absoluteString, @"url", 28 | nil]]]; 29 | return NO; 30 | } 31 | return YES; 32 | } 33 | 34 | - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context 35 | { 36 | UIScrollView *scrollView = object; 37 | self.height = scrollView.contentSize.height; 38 | if (SFQuestionCellTypeQuestion == self.type) { 39 | [SFMessager addMessage:[NSString stringWithFormat:@"%f", self.height] forKey:QUESTION_DETAIL_HEIGHT]; 40 | [[NSNotificationCenter defaultCenter] postNotificationName:SFNotificationQuestionLoaded object:nil]; 41 | } 42 | else if (SFQuestionCellTypeAnswer == self.type) { 43 | [SFMessager addMessage:[NSString stringWithFormat:@"%f", self.height] forKey:ANSWER_DETAIL_HEIGHT]; 44 | [[NSNotificationCenter defaultCenter] postNotificationName:SFNotificationAnswerLoaded object:nil]; 45 | } 46 | } 47 | 48 | #pragma mark - super 49 | 50 | - (id)initWithFrame:(CGRect)frame 51 | { 52 | self = [super initWithFrame:frame]; 53 | if (self) { 54 | self.autoresizingMask = (UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth); 55 | self.multipleTouchEnabled = NO; 56 | self.autoresizesSubviews = YES; 57 | self.type = SFQuestionCellTypeAnswer; 58 | [(UIScrollView *)self.subviews[0] setShowsHorizontalScrollIndicator:NO]; 59 | [(UIScrollView *)self.subviews[0] setShowsVerticalScrollIndicator:NO]; 60 | [(UIScrollView *)self.subviews[0] setBounces:NO]; 61 | self.opaque = NO; 62 | self.backgroundColor = [UIColor clearColor]; 63 | self.delegate = self; 64 | [self.scrollView addObserver:self forKeyPath:@"contentSize" options:NSKeyValueObservingOptionNew context:nil]; 65 | } 66 | return self; 67 | } 68 | 69 | - (void)dealloc 70 | { 71 | [self.scrollView removeObserver:self forKeyPath:@"contentSize"]; 72 | } 73 | 74 | @end 75 | -------------------------------------------------------------------------------- /SegmentFault/en.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* Localized versions of Info.plist keys */ 2 | 3 | -------------------------------------------------------------------------------- /SegmentFault/images/Default-568h@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gaosboy/iOSSF/2a3b86b62694e4a93175001d55d85d6cefbe7e29/SegmentFault/images/Default-568h@2x.png -------------------------------------------------------------------------------- /SegmentFault/images/Default.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gaosboy/iOSSF/2a3b86b62694e4a93175001d55d85d6cefbe7e29/SegmentFault/images/Default.png -------------------------------------------------------------------------------- /SegmentFault/images/Default@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gaosboy/iOSSF/2a3b86b62694e4a93175001d55d85d6cefbe7e29/SegmentFault/images/Default@2x.png -------------------------------------------------------------------------------- /SegmentFault/images/icons/Icon-72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gaosboy/iOSSF/2a3b86b62694e4a93175001d55d85d6cefbe7e29/SegmentFault/images/icons/Icon-72.png -------------------------------------------------------------------------------- /SegmentFault/images/icons/Icon-Small-50.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gaosboy/iOSSF/2a3b86b62694e4a93175001d55d85d6cefbe7e29/SegmentFault/images/icons/Icon-Small-50.png -------------------------------------------------------------------------------- /SegmentFault/images/icons/Icon-Small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gaosboy/iOSSF/2a3b86b62694e4a93175001d55d85d6cefbe7e29/SegmentFault/images/icons/Icon-Small.png -------------------------------------------------------------------------------- /SegmentFault/images/icons/Icon-Small@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gaosboy/iOSSF/2a3b86b62694e4a93175001d55d85d6cefbe7e29/SegmentFault/images/icons/Icon-Small@2x.png -------------------------------------------------------------------------------- /SegmentFault/images/icons/Icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gaosboy/iOSSF/2a3b86b62694e4a93175001d55d85d6cefbe7e29/SegmentFault/images/icons/Icon.png -------------------------------------------------------------------------------- /SegmentFault/images/icons/Icon@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gaosboy/iOSSF/2a3b86b62694e4a93175001d55d85d6cefbe7e29/SegmentFault/images/icons/Icon@2x.png -------------------------------------------------------------------------------- /SegmentFault/images/icons/iTunesArtwork.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gaosboy/iOSSF/2a3b86b62694e4a93175001d55d85d6cefbe7e29/SegmentFault/images/icons/iTunesArtwork.png -------------------------------------------------------------------------------- /SegmentFault/images/logout/logout_btn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gaosboy/iOSSF/2a3b86b62694e4a93175001d55d85d6cefbe7e29/SegmentFault/images/logout/logout_btn.png -------------------------------------------------------------------------------- /SegmentFault/images/logout/logout_btn@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gaosboy/iOSSF/2a3b86b62694e4a93175001d55d85d6cefbe7e29/SegmentFault/images/logout/logout_btn@2x.png -------------------------------------------------------------------------------- /SegmentFault/images/logout/logout_btn_pressed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gaosboy/iOSSF/2a3b86b62694e4a93175001d55d85d6cefbe7e29/SegmentFault/images/logout/logout_btn_pressed.png -------------------------------------------------------------------------------- /SegmentFault/images/logout/logout_btn_pressed@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gaosboy/iOSSF/2a3b86b62694e4a93175001d55d85d6cefbe7e29/SegmentFault/images/logout/logout_btn_pressed@2x.png -------------------------------------------------------------------------------- /SegmentFault/images/nav/back_button_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gaosboy/iOSSF/2a3b86b62694e4a93175001d55d85d6cefbe7e29/SegmentFault/images/nav/back_button_background.png -------------------------------------------------------------------------------- /SegmentFault/images/nav/back_button_background@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gaosboy/iOSSF/2a3b86b62694e4a93175001d55d85d6cefbe7e29/SegmentFault/images/nav/back_button_background@2x.png -------------------------------------------------------------------------------- /SegmentFault/images/nav/back_button_pressed_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gaosboy/iOSSF/2a3b86b62694e4a93175001d55d85d6cefbe7e29/SegmentFault/images/nav/back_button_pressed_background.png -------------------------------------------------------------------------------- /SegmentFault/images/nav/back_button_pressed_background@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gaosboy/iOSSF/2a3b86b62694e4a93175001d55d85d6cefbe7e29/SegmentFault/images/nav/back_button_pressed_background@2x.png -------------------------------------------------------------------------------- /SegmentFault/images/nav/navigationbar_light_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gaosboy/iOSSF/2a3b86b62694e4a93175001d55d85d6cefbe7e29/SegmentFault/images/nav/navigationbar_light_background.png -------------------------------------------------------------------------------- /SegmentFault/images/nav/navigationbar_light_background@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gaosboy/iOSSF/2a3b86b62694e4a93175001d55d85d6cefbe7e29/SegmentFault/images/nav/navigationbar_light_background@2x.png -------------------------------------------------------------------------------- /SegmentFault/images/nav/slide_navigator_button.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gaosboy/iOSSF/2a3b86b62694e4a93175001d55d85d6cefbe7e29/SegmentFault/images/nav/slide_navigator_button.png -------------------------------------------------------------------------------- /SegmentFault/images/nav/slide_navigator_button@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gaosboy/iOSSF/2a3b86b62694e4a93175001d55d85d6cefbe7e29/SegmentFault/images/nav/slide_navigator_button@2x.png -------------------------------------------------------------------------------- /SegmentFault/images/nav/slide_navigator_button_pressed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gaosboy/iOSSF/2a3b86b62694e4a93175001d55d85d6cefbe7e29/SegmentFault/images/nav/slide_navigator_button_pressed.png -------------------------------------------------------------------------------- /SegmentFault/images/nav/slide_navigator_button_pressed@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gaosboy/iOSSF/2a3b86b62694e4a93175001d55d85d6cefbe7e29/SegmentFault/images/nav/slide_navigator_button_pressed@2x.png -------------------------------------------------------------------------------- /SegmentFault/images/nav/slide_navigator_cell_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gaosboy/iOSSF/2a3b86b62694e4a93175001d55d85d6cefbe7e29/SegmentFault/images/nav/slide_navigator_cell_background.png -------------------------------------------------------------------------------- /SegmentFault/images/nav/slide_navigator_cell_background@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gaosboy/iOSSF/2a3b86b62694e4a93175001d55d85d6cefbe7e29/SegmentFault/images/nav/slide_navigator_cell_background@2x.png -------------------------------------------------------------------------------- /SegmentFault/images/nav/slide_navigator_cell_chevron.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gaosboy/iOSSF/2a3b86b62694e4a93175001d55d85d6cefbe7e29/SegmentFault/images/nav/slide_navigator_cell_chevron.png -------------------------------------------------------------------------------- /SegmentFault/images/nav/slide_navigator_cell_chevron@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gaosboy/iOSSF/2a3b86b62694e4a93175001d55d85d6cefbe7e29/SegmentFault/images/nav/slide_navigator_cell_chevron@2x.png -------------------------------------------------------------------------------- /SegmentFault/images/nav/slide_navigator_cell_selected_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gaosboy/iOSSF/2a3b86b62694e4a93175001d55d85d6cefbe7e29/SegmentFault/images/nav/slide_navigator_cell_selected_background.png -------------------------------------------------------------------------------- /SegmentFault/images/nav/slide_navigator_cell_selected_background@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gaosboy/iOSSF/2a3b86b62694e4a93175001d55d85d6cefbe7e29/SegmentFault/images/nav/slide_navigator_cell_selected_background@2x.png -------------------------------------------------------------------------------- /SegmentFault/images/nav/slide_navigator_cell_selected_chevron.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gaosboy/iOSSF/2a3b86b62694e4a93175001d55d85d6cefbe7e29/SegmentFault/images/nav/slide_navigator_cell_selected_chevron.png -------------------------------------------------------------------------------- /SegmentFault/images/nav/slide_navigator_cell_selected_chevron@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gaosboy/iOSSF/2a3b86b62694e4a93175001d55d85d6cefbe7e29/SegmentFault/images/nav/slide_navigator_cell_selected_chevron@2x.png -------------------------------------------------------------------------------- /SegmentFault/images/nav/slide_navigator_dark_backgrond.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gaosboy/iOSSF/2a3b86b62694e4a93175001d55d85d6cefbe7e29/SegmentFault/images/nav/slide_navigator_dark_backgrond.png -------------------------------------------------------------------------------- /SegmentFault/images/nav/slide_navigator_dark_backgrond@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gaosboy/iOSSF/2a3b86b62694e4a93175001d55d85d6cefbe7e29/SegmentFault/images/nav/slide_navigator_dark_backgrond@2x.png -------------------------------------------------------------------------------- /SegmentFault/images/nav/slide_navigator_light_backgrond.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gaosboy/iOSSF/2a3b86b62694e4a93175001d55d85d6cefbe7e29/SegmentFault/images/nav/slide_navigator_light_backgrond.png -------------------------------------------------------------------------------- /SegmentFault/images/nav/slide_navigator_light_backgrond@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gaosboy/iOSSF/2a3b86b62694e4a93175001d55d85d6cefbe7e29/SegmentFault/images/nav/slide_navigator_light_backgrond@2x.png -------------------------------------------------------------------------------- /SegmentFault/images/nav/slide_navigator_section_header_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gaosboy/iOSSF/2a3b86b62694e4a93175001d55d85d6cefbe7e29/SegmentFault/images/nav/slide_navigator_section_header_background.png -------------------------------------------------------------------------------- /SegmentFault/images/nav/slide_navigator_section_header_background@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gaosboy/iOSSF/2a3b86b62694e4a93175001d55d85d6cefbe7e29/SegmentFault/images/nav/slide_navigator_section_header_background@2x.png -------------------------------------------------------------------------------- /SegmentFault/images/questiondetail/question_detail_section_header_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gaosboy/iOSSF/2a3b86b62694e4a93175001d55d85d6cefbe7e29/SegmentFault/images/questiondetail/question_detail_section_header_background.png -------------------------------------------------------------------------------- /SegmentFault/images/questiondetail/question_detail_section_header_background@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gaosboy/iOSSF/2a3b86b62694e4a93175001d55d85d6cefbe7e29/SegmentFault/images/questiondetail/question_detail_section_header_background@2x.png -------------------------------------------------------------------------------- /SegmentFault/images/questionlist/qlist_cell_pop.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gaosboy/iOSSF/2a3b86b62694e4a93175001d55d85d6cefbe7e29/SegmentFault/images/questionlist/qlist_cell_pop.png -------------------------------------------------------------------------------- /SegmentFault/images/questionlist/qlist_cell_pop@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gaosboy/iOSSF/2a3b86b62694e4a93175001d55d85d6cefbe7e29/SegmentFault/images/questionlist/qlist_cell_pop@2x.png -------------------------------------------------------------------------------- /SegmentFault/images/questionlist/qlist_cell_pop_unanswered.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gaosboy/iOSSF/2a3b86b62694e4a93175001d55d85d6cefbe7e29/SegmentFault/images/questionlist/qlist_cell_pop_unanswered.png -------------------------------------------------------------------------------- /SegmentFault/images/questionlist/qlist_cell_pop_unanswered@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gaosboy/iOSSF/2a3b86b62694e4a93175001d55d85d6cefbe7e29/SegmentFault/images/questionlist/qlist_cell_pop_unanswered@2x.png -------------------------------------------------------------------------------- /SegmentFault/images/questionlist/qlist_cell_selected_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gaosboy/iOSSF/2a3b86b62694e4a93175001d55d85d6cefbe7e29/SegmentFault/images/questionlist/qlist_cell_selected_background.png -------------------------------------------------------------------------------- /SegmentFault/images/questionlist/qlist_cell_selected_background@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gaosboy/iOSSF/2a3b86b62694e4a93175001d55d85d6cefbe7e29/SegmentFault/images/questionlist/qlist_cell_selected_background@2x.png -------------------------------------------------------------------------------- /SegmentFault/imagesV2/nav/nav_back.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gaosboy/iOSSF/2a3b86b62694e4a93175001d55d85d6cefbe7e29/SegmentFault/imagesV2/nav/nav_back.png -------------------------------------------------------------------------------- /SegmentFault/imagesV2/nav/nav_back@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gaosboy/iOSSF/2a3b86b62694e4a93175001d55d85d6cefbe7e29/SegmentFault/imagesV2/nav/nav_back@2x.png -------------------------------------------------------------------------------- /SegmentFault/imagesV2/nav/nav_bar_bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gaosboy/iOSSF/2a3b86b62694e4a93175001d55d85d6cefbe7e29/SegmentFault/imagesV2/nav/nav_bar_bg.png -------------------------------------------------------------------------------- /SegmentFault/imagesV2/nav/nav_bar_bg@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gaosboy/iOSSF/2a3b86b62694e4a93175001d55d85d6cefbe7e29/SegmentFault/imagesV2/nav/nav_bar_bg@2x.png -------------------------------------------------------------------------------- /SegmentFault/imagesV2/nav/nav_cell_arrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gaosboy/iOSSF/2a3b86b62694e4a93175001d55d85d6cefbe7e29/SegmentFault/imagesV2/nav/nav_cell_arrow.png -------------------------------------------------------------------------------- /SegmentFault/imagesV2/nav/nav_cell_arrow@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gaosboy/iOSSF/2a3b86b62694e4a93175001d55d85d6cefbe7e29/SegmentFault/imagesV2/nav/nav_cell_arrow@2x.png -------------------------------------------------------------------------------- /SegmentFault/imagesV2/nav/nav_cell_arrow_active.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gaosboy/iOSSF/2a3b86b62694e4a93175001d55d85d6cefbe7e29/SegmentFault/imagesV2/nav/nav_cell_arrow_active.png -------------------------------------------------------------------------------- /SegmentFault/imagesV2/nav/nav_cell_arrow_active@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gaosboy/iOSSF/2a3b86b62694e4a93175001d55d85d6cefbe7e29/SegmentFault/imagesV2/nav/nav_cell_arrow_active@2x.png -------------------------------------------------------------------------------- /SegmentFault/imagesV2/nav/nav_cell_bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gaosboy/iOSSF/2a3b86b62694e4a93175001d55d85d6cefbe7e29/SegmentFault/imagesV2/nav/nav_cell_bg.png -------------------------------------------------------------------------------- /SegmentFault/imagesV2/nav/nav_cell_bg@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gaosboy/iOSSF/2a3b86b62694e4a93175001d55d85d6cefbe7e29/SegmentFault/imagesV2/nav/nav_cell_bg@2x.png -------------------------------------------------------------------------------- /SegmentFault/imagesV2/nav/nav_cell_bg_active.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gaosboy/iOSSF/2a3b86b62694e4a93175001d55d85d6cefbe7e29/SegmentFault/imagesV2/nav/nav_cell_bg_active.png -------------------------------------------------------------------------------- /SegmentFault/imagesV2/nav/nav_cell_bg_active@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gaosboy/iOSSF/2a3b86b62694e4a93175001d55d85d6cefbe7e29/SegmentFault/imagesV2/nav/nav_cell_bg_active@2x.png -------------------------------------------------------------------------------- /SegmentFault/imagesV2/nav/nav_menu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gaosboy/iOSSF/2a3b86b62694e4a93175001d55d85d6cefbe7e29/SegmentFault/imagesV2/nav/nav_menu.png -------------------------------------------------------------------------------- /SegmentFault/imagesV2/nav/nav_menu@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gaosboy/iOSSF/2a3b86b62694e4a93175001d55d85d6cefbe7e29/SegmentFault/imagesV2/nav/nav_menu@2x.png -------------------------------------------------------------------------------- /SegmentFault/imagesV2/questiondetail/question_list_header_bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gaosboy/iOSSF/2a3b86b62694e4a93175001d55d85d6cefbe7e29/SegmentFault/imagesV2/questiondetail/question_list_header_bg.png -------------------------------------------------------------------------------- /SegmentFault/imagesV2/questiondetail/question_list_header_bg@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gaosboy/iOSSF/2a3b86b62694e4a93175001d55d85d6cefbe7e29/SegmentFault/imagesV2/questiondetail/question_list_header_bg@2x.png -------------------------------------------------------------------------------- /SegmentFault/imagesV2/questionlist/question_list_cell_sep.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gaosboy/iOSSF/2a3b86b62694e4a93175001d55d85d6cefbe7e29/SegmentFault/imagesV2/questionlist/question_list_cell_sep.png -------------------------------------------------------------------------------- /SegmentFault/imagesV2/questionlist/question_list_cell_sep@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gaosboy/iOSSF/2a3b86b62694e4a93175001d55d85d6cefbe7e29/SegmentFault/imagesV2/questionlist/question_list_cell_sep@2x.png -------------------------------------------------------------------------------- /SegmentFault/imagesV2/questionlist/question_list_vote.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gaosboy/iOSSF/2a3b86b62694e4a93175001d55d85d6cefbe7e29/SegmentFault/imagesV2/questionlist/question_list_vote.png -------------------------------------------------------------------------------- /SegmentFault/imagesV2/questionlist/question_list_vote@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gaosboy/iOSSF/2a3b86b62694e4a93175001d55d85d6cefbe7e29/SegmentFault/imagesV2/questionlist/question_list_vote@2x.png -------------------------------------------------------------------------------- /SegmentFault/main.m: -------------------------------------------------------------------------------- 1 | // 2 | // main.m 3 | // SegmentFault 4 | // 5 | // Created by jiajun on 11/24/12. 6 | // Copyright (c) 2012 SegmentFault.com. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | #import "SFAppDelegate.h" 12 | 13 | int main(int argc, char *argv[]) 14 | { 15 | @autoreleasepool { 16 | return UIApplicationMain(argc, argv, nil, NSStringFromClass([SFAppDelegate class])); 17 | } 18 | } 19 | --------------------------------------------------------------------------------