├── SegmentFault
├── Resource
│ ├── GetQuestionAnswer.js.txt
│ ├── GetQuestionDetail.js.txt
│ ├── AnswerDetail.html.txt
│ ├── QuestionDetail.html.txt
│ └── AnswerDetail.js.txt
├── en.lproj
│ └── InfoPlist.strings
├── images
│ ├── Default.png
│ ├── Default@2x.png
│ ├── icons
│ │ ├── Icon.png
│ │ ├── Icon-72.png
│ │ ├── Icon@2x.png
│ │ ├── Icon-Small.png
│ │ ├── Icon-Small-50.png
│ │ ├── Icon-Small@2x.png
│ │ └── iTunesArtwork.png
│ ├── Default-568h@2x.png
│ ├── logout
│ │ ├── logout_btn.png
│ │ ├── logout_btn@2x.png
│ │ ├── logout_btn_pressed.png
│ │ └── logout_btn_pressed@2x.png
│ ├── nav
│ │ ├── back_button_background.png
│ │ ├── slide_navigator_button.png
│ │ ├── back_button_background@2x.png
│ │ ├── slide_navigator_button@2x.png
│ │ ├── slide_navigator_cell_chevron.png
│ │ ├── back_button_pressed_background.png
│ │ ├── navigationbar_light_background.png
│ │ ├── slide_navigator_button_pressed.png
│ │ ├── slide_navigator_cell_background.png
│ │ ├── slide_navigator_cell_chevron@2x.png
│ │ ├── slide_navigator_dark_backgrond.png
│ │ ├── slide_navigator_light_backgrond.png
│ │ ├── back_button_pressed_background@2x.png
│ │ ├── navigationbar_light_background@2x.png
│ │ ├── slide_navigator_button_pressed@2x.png
│ │ ├── slide_navigator_cell_background@2x.png
│ │ ├── slide_navigator_dark_backgrond@2x.png
│ │ ├── slide_navigator_light_backgrond@2x.png
│ │ ├── slide_navigator_cell_selected_chevron.png
│ │ ├── slide_navigator_cell_selected_background.png
│ │ ├── slide_navigator_cell_selected_chevron@2x.png
│ │ ├── slide_navigator_section_header_background.png
│ │ ├── slide_navigator_cell_selected_background@2x.png
│ │ └── slide_navigator_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
│ └── questiondetail
│ │ ├── question_detail_section_header_background.png
│ │ └── question_detail_section_header_background@2x.png
├── imagesV2
│ ├── nav
│ │ ├── nav_back.png
│ │ ├── nav_menu.png
│ │ ├── nav_back@2x.png
│ │ ├── nav_bar_bg.png
│ │ ├── nav_cell_bg.png
│ │ ├── nav_menu@2x.png
│ │ ├── nav_bar_bg@2x.png
│ │ ├── nav_cell_arrow.png
│ │ ├── nav_cell_bg@2x.png
│ │ ├── nav_cell_arrow@2x.png
│ │ ├── nav_cell_bg_active.png
│ │ ├── nav_cell_arrow_active.png
│ │ ├── nav_cell_bg_active@2x.png
│ │ └── nav_cell_arrow_active@2x.png
│ ├── questionlist
│ │ ├── question_list_vote.png
│ │ ├── question_list_cell_sep.png
│ │ ├── question_list_vote@2x.png
│ │ └── question_list_cell_sep@2x.png
│ └── questiondetail
│ │ ├── question_list_header_bg.png
│ │ └── question_list_header_bg@2x.png
├── ViewControllers
│ ├── Base
│ │ ├── SFWebViewController.h
│ │ ├── SFRootViewController.h
│ │ ├── SFRootViewController.m
│ │ └── SFWebViewController.m
│ ├── SFLoginViewController.h
│ ├── Nav
│ │ ├── SFSlideNavViewController.h
│ │ └── SFSlideNavViewController.m
│ ├── SFQuestionListViewController.h
│ ├── SFQuestionDetailViewController.h
│ ├── SFLoginViewController.m
│ ├── SFQuestionListViewController.m
│ └── SFQuestionDetailViewController.m
├── Tools
│ ├── SFMessager.h
│ ├── SFTools.h
│ ├── SFTools.m
│ └── SFMessager.m
├── main.m
├── Views
│ ├── SFLabel.h
│ ├── SFLocalWebView.h
│ ├── Cells
│ │ ├── SFQuestionListCell.h
│ │ └── SFQuestionListCell.m
│ ├── SFLabel.m
│ └── SFLocalWebView.m
├── Services
│ ├── SFLoginService.h
│ ├── SFQuestionService.h
│ ├── SFQuestionService.m
│ └── SFLoginService.m
├── DataCenters
│ ├── SFQuestion.h
│ └── SFQuestion.m
├── Delegates
│ ├── SFAppDelegate.h
│ └── SFAppDelegate.m
├── SegmentFault-Info.plist
└── SegmentFault-Prefix.pch
├── .gitignore
├── .gitmodules
├── LICENSE
├── README.md
└── SegmentFault.xcodeproj
└── project.pbxproj
/SegmentFault/Resource/GetQuestionAnswer.js.txt:
--------------------------------------------------------------------------------
1 | document.getElementById('answer').innerHTML
--------------------------------------------------------------------------------
/SegmentFault/en.lproj/InfoPlist.strings:
--------------------------------------------------------------------------------
1 | /* Localized versions of Info.plist keys */
2 |
3 |
--------------------------------------------------------------------------------
/SegmentFault/images/Default.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gaosboy/iOSSF/HEAD/SegmentFault/images/Default.png
--------------------------------------------------------------------------------
/SegmentFault/images/Default@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gaosboy/iOSSF/HEAD/SegmentFault/images/Default@2x.png
--------------------------------------------------------------------------------
/SegmentFault/images/icons/Icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gaosboy/iOSSF/HEAD/SegmentFault/images/icons/Icon.png
--------------------------------------------------------------------------------
/SegmentFault/images/icons/Icon-72.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gaosboy/iOSSF/HEAD/SegmentFault/images/icons/Icon-72.png
--------------------------------------------------------------------------------
/SegmentFault/images/icons/Icon@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gaosboy/iOSSF/HEAD/SegmentFault/images/icons/Icon@2x.png
--------------------------------------------------------------------------------
/SegmentFault/images/Default-568h@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gaosboy/iOSSF/HEAD/SegmentFault/images/Default-568h@2x.png
--------------------------------------------------------------------------------
/SegmentFault/imagesV2/nav/nav_back.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gaosboy/iOSSF/HEAD/SegmentFault/imagesV2/nav/nav_back.png
--------------------------------------------------------------------------------
/SegmentFault/imagesV2/nav/nav_menu.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gaosboy/iOSSF/HEAD/SegmentFault/imagesV2/nav/nav_menu.png
--------------------------------------------------------------------------------
/SegmentFault/images/icons/Icon-Small.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gaosboy/iOSSF/HEAD/SegmentFault/images/icons/Icon-Small.png
--------------------------------------------------------------------------------
/SegmentFault/images/logout/logout_btn.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gaosboy/iOSSF/HEAD/SegmentFault/images/logout/logout_btn.png
--------------------------------------------------------------------------------
/SegmentFault/imagesV2/nav/nav_back@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gaosboy/iOSSF/HEAD/SegmentFault/imagesV2/nav/nav_back@2x.png
--------------------------------------------------------------------------------
/SegmentFault/imagesV2/nav/nav_bar_bg.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gaosboy/iOSSF/HEAD/SegmentFault/imagesV2/nav/nav_bar_bg.png
--------------------------------------------------------------------------------
/SegmentFault/imagesV2/nav/nav_cell_bg.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gaosboy/iOSSF/HEAD/SegmentFault/imagesV2/nav/nav_cell_bg.png
--------------------------------------------------------------------------------
/SegmentFault/imagesV2/nav/nav_menu@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gaosboy/iOSSF/HEAD/SegmentFault/imagesV2/nav/nav_menu@2x.png
--------------------------------------------------------------------------------
/SegmentFault/images/icons/Icon-Small-50.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gaosboy/iOSSF/HEAD/SegmentFault/images/icons/Icon-Small-50.png
--------------------------------------------------------------------------------
/SegmentFault/images/icons/Icon-Small@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gaosboy/iOSSF/HEAD/SegmentFault/images/icons/Icon-Small@2x.png
--------------------------------------------------------------------------------
/SegmentFault/images/icons/iTunesArtwork.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gaosboy/iOSSF/HEAD/SegmentFault/images/icons/iTunesArtwork.png
--------------------------------------------------------------------------------
/SegmentFault/images/logout/logout_btn@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gaosboy/iOSSF/HEAD/SegmentFault/images/logout/logout_btn@2x.png
--------------------------------------------------------------------------------
/SegmentFault/imagesV2/nav/nav_bar_bg@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gaosboy/iOSSF/HEAD/SegmentFault/imagesV2/nav/nav_bar_bg@2x.png
--------------------------------------------------------------------------------
/SegmentFault/imagesV2/nav/nav_cell_arrow.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gaosboy/iOSSF/HEAD/SegmentFault/imagesV2/nav/nav_cell_arrow.png
--------------------------------------------------------------------------------
/SegmentFault/imagesV2/nav/nav_cell_bg@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gaosboy/iOSSF/HEAD/SegmentFault/imagesV2/nav/nav_cell_bg@2x.png
--------------------------------------------------------------------------------
/SegmentFault/imagesV2/nav/nav_cell_arrow@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gaosboy/iOSSF/HEAD/SegmentFault/imagesV2/nav/nav_cell_arrow@2x.png
--------------------------------------------------------------------------------
/SegmentFault/images/logout/logout_btn_pressed.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gaosboy/iOSSF/HEAD/SegmentFault/images/logout/logout_btn_pressed.png
--------------------------------------------------------------------------------
/SegmentFault/imagesV2/nav/nav_cell_bg_active.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gaosboy/iOSSF/HEAD/SegmentFault/imagesV2/nav/nav_cell_bg_active.png
--------------------------------------------------------------------------------
/SegmentFault/images/logout/logout_btn_pressed@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gaosboy/iOSSF/HEAD/SegmentFault/images/logout/logout_btn_pressed@2x.png
--------------------------------------------------------------------------------
/SegmentFault/images/nav/back_button_background.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gaosboy/iOSSF/HEAD/SegmentFault/images/nav/back_button_background.png
--------------------------------------------------------------------------------
/SegmentFault/images/nav/slide_navigator_button.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gaosboy/iOSSF/HEAD/SegmentFault/images/nav/slide_navigator_button.png
--------------------------------------------------------------------------------
/SegmentFault/images/questionlist/qlist_cell_pop.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gaosboy/iOSSF/HEAD/SegmentFault/images/questionlist/qlist_cell_pop.png
--------------------------------------------------------------------------------
/SegmentFault/imagesV2/nav/nav_cell_arrow_active.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gaosboy/iOSSF/HEAD/SegmentFault/imagesV2/nav/nav_cell_arrow_active.png
--------------------------------------------------------------------------------
/SegmentFault/imagesV2/nav/nav_cell_bg_active@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gaosboy/iOSSF/HEAD/SegmentFault/imagesV2/nav/nav_cell_bg_active@2x.png
--------------------------------------------------------------------------------
/SegmentFault/images/nav/back_button_background@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gaosboy/iOSSF/HEAD/SegmentFault/images/nav/back_button_background@2x.png
--------------------------------------------------------------------------------
/SegmentFault/images/nav/slide_navigator_button@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gaosboy/iOSSF/HEAD/SegmentFault/images/nav/slide_navigator_button@2x.png
--------------------------------------------------------------------------------
/SegmentFault/images/questionlist/qlist_cell_pop@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gaosboy/iOSSF/HEAD/SegmentFault/images/questionlist/qlist_cell_pop@2x.png
--------------------------------------------------------------------------------
/SegmentFault/imagesV2/nav/nav_cell_arrow_active@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gaosboy/iOSSF/HEAD/SegmentFault/imagesV2/nav/nav_cell_arrow_active@2x.png
--------------------------------------------------------------------------------
/SegmentFault/images/nav/slide_navigator_cell_chevron.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gaosboy/iOSSF/HEAD/SegmentFault/images/nav/slide_navigator_cell_chevron.png
--------------------------------------------------------------------------------
/SegmentFault/imagesV2/questionlist/question_list_vote.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gaosboy/iOSSF/HEAD/SegmentFault/imagesV2/questionlist/question_list_vote.png
--------------------------------------------------------------------------------
/SegmentFault/images/nav/back_button_pressed_background.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gaosboy/iOSSF/HEAD/SegmentFault/images/nav/back_button_pressed_background.png
--------------------------------------------------------------------------------
/SegmentFault/images/nav/navigationbar_light_background.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gaosboy/iOSSF/HEAD/SegmentFault/images/nav/navigationbar_light_background.png
--------------------------------------------------------------------------------
/SegmentFault/images/nav/slide_navigator_button_pressed.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gaosboy/iOSSF/HEAD/SegmentFault/images/nav/slide_navigator_button_pressed.png
--------------------------------------------------------------------------------
/SegmentFault/images/nav/slide_navigator_cell_background.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gaosboy/iOSSF/HEAD/SegmentFault/images/nav/slide_navigator_cell_background.png
--------------------------------------------------------------------------------
/SegmentFault/images/nav/slide_navigator_cell_chevron@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gaosboy/iOSSF/HEAD/SegmentFault/images/nav/slide_navigator_cell_chevron@2x.png
--------------------------------------------------------------------------------
/SegmentFault/images/nav/slide_navigator_dark_backgrond.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gaosboy/iOSSF/HEAD/SegmentFault/images/nav/slide_navigator_dark_backgrond.png
--------------------------------------------------------------------------------
/SegmentFault/images/nav/slide_navigator_light_backgrond.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gaosboy/iOSSF/HEAD/SegmentFault/images/nav/slide_navigator_light_backgrond.png
--------------------------------------------------------------------------------
/SegmentFault/images/nav/back_button_pressed_background@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gaosboy/iOSSF/HEAD/SegmentFault/images/nav/back_button_pressed_background@2x.png
--------------------------------------------------------------------------------
/SegmentFault/images/nav/navigationbar_light_background@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gaosboy/iOSSF/HEAD/SegmentFault/images/nav/navigationbar_light_background@2x.png
--------------------------------------------------------------------------------
/SegmentFault/images/nav/slide_navigator_button_pressed@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gaosboy/iOSSF/HEAD/SegmentFault/images/nav/slide_navigator_button_pressed@2x.png
--------------------------------------------------------------------------------
/SegmentFault/images/nav/slide_navigator_cell_background@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gaosboy/iOSSF/HEAD/SegmentFault/images/nav/slide_navigator_cell_background@2x.png
--------------------------------------------------------------------------------
/SegmentFault/images/nav/slide_navigator_dark_backgrond@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gaosboy/iOSSF/HEAD/SegmentFault/images/nav/slide_navigator_dark_backgrond@2x.png
--------------------------------------------------------------------------------
/SegmentFault/images/nav/slide_navigator_light_backgrond@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gaosboy/iOSSF/HEAD/SegmentFault/images/nav/slide_navigator_light_backgrond@2x.png
--------------------------------------------------------------------------------
/SegmentFault/images/questionlist/qlist_cell_pop_unanswered.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gaosboy/iOSSF/HEAD/SegmentFault/images/questionlist/qlist_cell_pop_unanswered.png
--------------------------------------------------------------------------------
/SegmentFault/imagesV2/questionlist/question_list_cell_sep.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gaosboy/iOSSF/HEAD/SegmentFault/imagesV2/questionlist/question_list_cell_sep.png
--------------------------------------------------------------------------------
/SegmentFault/imagesV2/questionlist/question_list_vote@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gaosboy/iOSSF/HEAD/SegmentFault/imagesV2/questionlist/question_list_vote@2x.png
--------------------------------------------------------------------------------
/SegmentFault/imagesV2/questiondetail/question_list_header_bg.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gaosboy/iOSSF/HEAD/SegmentFault/imagesV2/questiondetail/question_list_header_bg.png
--------------------------------------------------------------------------------
/SegmentFault/imagesV2/questionlist/question_list_cell_sep@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gaosboy/iOSSF/HEAD/SegmentFault/imagesV2/questionlist/question_list_cell_sep@2x.png
--------------------------------------------------------------------------------
/SegmentFault/images/nav/slide_navigator_cell_selected_chevron.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gaosboy/iOSSF/HEAD/SegmentFault/images/nav/slide_navigator_cell_selected_chevron.png
--------------------------------------------------------------------------------
/SegmentFault/images/questionlist/qlist_cell_pop_unanswered@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gaosboy/iOSSF/HEAD/SegmentFault/images/questionlist/qlist_cell_pop_unanswered@2x.png
--------------------------------------------------------------------------------
/SegmentFault/images/questionlist/qlist_cell_selected_background.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gaosboy/iOSSF/HEAD/SegmentFault/images/questionlist/qlist_cell_selected_background.png
--------------------------------------------------------------------------------
/SegmentFault/imagesV2/questiondetail/question_list_header_bg@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gaosboy/iOSSF/HEAD/SegmentFault/imagesV2/questiondetail/question_list_header_bg@2x.png
--------------------------------------------------------------------------------
/SegmentFault/images/nav/slide_navigator_cell_selected_background.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gaosboy/iOSSF/HEAD/SegmentFault/images/nav/slide_navigator_cell_selected_background.png
--------------------------------------------------------------------------------
/SegmentFault/images/nav/slide_navigator_cell_selected_chevron@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gaosboy/iOSSF/HEAD/SegmentFault/images/nav/slide_navigator_cell_selected_chevron@2x.png
--------------------------------------------------------------------------------
/SegmentFault/images/nav/slide_navigator_section_header_background.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gaosboy/iOSSF/HEAD/SegmentFault/images/nav/slide_navigator_section_header_background.png
--------------------------------------------------------------------------------
/SegmentFault/images/nav/slide_navigator_cell_selected_background@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gaosboy/iOSSF/HEAD/SegmentFault/images/nav/slide_navigator_cell_selected_background@2x.png
--------------------------------------------------------------------------------
/SegmentFault/images/nav/slide_navigator_section_header_background@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gaosboy/iOSSF/HEAD/SegmentFault/images/nav/slide_navigator_section_header_background@2x.png
--------------------------------------------------------------------------------
/SegmentFault/images/questionlist/qlist_cell_selected_background@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gaosboy/iOSSF/HEAD/SegmentFault/images/questionlist/qlist_cell_selected_background@2x.png
--------------------------------------------------------------------------------
/SegmentFault/images/questiondetail/question_detail_section_header_background.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gaosboy/iOSSF/HEAD/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/HEAD/SegmentFault/images/questiondetail/question_detail_section_header_background@2x.png
--------------------------------------------------------------------------------
/SegmentFault/Resource/GetQuestionDetail.js.txt:
--------------------------------------------------------------------------------
1 | document.getElementById('q-%@').childNodes[3].innerHTML+"
"
--------------------------------------------------------------------------------
/.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 |
--------------------------------------------------------------------------------
/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/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/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/Resource/AnswerDetail.html.txt:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 | %@
10 |
11 |
12 |
--------------------------------------------------------------------------------
/SegmentFault/Resource/QuestionDetail.html.txt:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 | %@
10 |
11 |
12 |
--------------------------------------------------------------------------------
/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/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/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 |
--------------------------------------------------------------------------------
/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/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/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/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/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/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/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/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/Resource/AnswerDetail.js.txt:
--------------------------------------------------------------------------------
1 | var pc = document.getElementsByClassName('post-cell');
2 | while (0
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/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 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/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/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/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/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/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/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/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 |
--------------------------------------------------------------------------------
/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/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/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/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/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/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/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/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.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 |
--------------------------------------------------------------------------------