├── JieTableView.xcodeproj ├── project.pbxproj ├── project.xcworkspace │ ├── contents.xcworkspacedata │ └── xcuserdata │ │ └── jiezhang.xcuserdatad │ │ └── UserInterfaceState.xcuserstate └── xcuserdata │ └── jiezhang.xcuserdatad │ ├── xcdebugger │ └── Breakpoints_v2.xcbkptlist │ └── xcschemes │ ├── JieTableView.xcscheme │ └── xcschememanagement.plist ├── JieTableView ├── AppDelegate.swift ├── Base.lproj │ └── Main.storyboard ├── Images.xcassets │ ├── AppIcon.appiconset │ │ └── Contents.json │ └── LaunchImage.launchimage │ │ └── Contents.json ├── Info.plist ├── JieDetailViewController.swift ├── JieMain.storyboard ├── JieTableViewCell.swift ├── JieTableViewController.swift ├── default_img.png └── videos.plist ├── JieTableViewTests ├── Info.plist └── JieTableViewTests.swift └── README.md /JieTableView.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 978121B619E213E60036AAD0 /* JieMain.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 978121B519E213E60036AAD0 /* JieMain.storyboard */; }; 11 | 97BCA49619E133F600ACA78B /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97BCA49519E133F600ACA78B /* AppDelegate.swift */; }; 12 | 97BCA49D19E133F600ACA78B /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97BCA49C19E133F600ACA78B /* Images.xcassets */; }; 13 | 97BCA4A919E133F600ACA78B /* JieTableViewTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97BCA4A819E133F600ACA78B /* JieTableViewTests.swift */; }; 14 | 97BCA4B519E136B600ACA78B /* JieTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97BCA4B419E136B600ACA78B /* JieTableViewController.swift */; }; 15 | 97BCA4B719E140A200ACA78B /* JieTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97BCA4B619E140A200ACA78B /* JieTableViewCell.swift */; }; 16 | 97BCA4B919E141C100ACA78B /* default_img.png in Resources */ = {isa = PBXBuildFile; fileRef = 97BCA4B819E141C100ACA78B /* default_img.png */; }; 17 | 97BCA4BB19E1426F00ACA78B /* videos.plist in Resources */ = {isa = PBXBuildFile; fileRef = 97BCA4BA19E1426F00ACA78B /* videos.plist */; }; 18 | 97BCA4BD19E168A100ACA78B /* JieDetailViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97BCA4BC19E168A100ACA78B /* JieDetailViewController.swift */; }; 19 | /* End PBXBuildFile section */ 20 | 21 | /* Begin PBXContainerItemProxy section */ 22 | 97BCA4A319E133F600ACA78B /* PBXContainerItemProxy */ = { 23 | isa = PBXContainerItemProxy; 24 | containerPortal = 97BCA48819E133F600ACA78B /* Project object */; 25 | proxyType = 1; 26 | remoteGlobalIDString = 97BCA48F19E133F600ACA78B; 27 | remoteInfo = JieTableView; 28 | }; 29 | /* End PBXContainerItemProxy section */ 30 | 31 | /* Begin PBXFileReference section */ 32 | 978121B519E213E60036AAD0 /* JieMain.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = JieMain.storyboard; sourceTree = ""; }; 33 | 97BCA49019E133F600ACA78B /* JieTableView.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = JieTableView.app; sourceTree = BUILT_PRODUCTS_DIR; }; 34 | 97BCA49419E133F600ACA78B /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 35 | 97BCA49519E133F600ACA78B /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 36 | 97BCA49C19E133F600ACA78B /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; 37 | 97BCA4A219E133F600ACA78B /* JieTableViewTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = JieTableViewTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 38 | 97BCA4A719E133F600ACA78B /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 39 | 97BCA4A819E133F600ACA78B /* JieTableViewTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JieTableViewTests.swift; sourceTree = ""; }; 40 | 97BCA4B419E136B600ACA78B /* JieTableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = JieTableViewController.swift; sourceTree = ""; }; 41 | 97BCA4B619E140A200ACA78B /* JieTableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = JieTableViewCell.swift; sourceTree = ""; }; 42 | 97BCA4B819E141C100ACA78B /* default_img.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = default_img.png; sourceTree = ""; }; 43 | 97BCA4BA19E1426F00ACA78B /* videos.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = videos.plist; sourceTree = ""; }; 44 | 97BCA4BC19E168A100ACA78B /* JieDetailViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = JieDetailViewController.swift; sourceTree = ""; }; 45 | /* End PBXFileReference section */ 46 | 47 | /* Begin PBXFrameworksBuildPhase section */ 48 | 97BCA48D19E133F600ACA78B /* Frameworks */ = { 49 | isa = PBXFrameworksBuildPhase; 50 | buildActionMask = 2147483647; 51 | files = ( 52 | ); 53 | runOnlyForDeploymentPostprocessing = 0; 54 | }; 55 | 97BCA49F19E133F600ACA78B /* Frameworks */ = { 56 | isa = PBXFrameworksBuildPhase; 57 | buildActionMask = 2147483647; 58 | files = ( 59 | ); 60 | runOnlyForDeploymentPostprocessing = 0; 61 | }; 62 | /* End PBXFrameworksBuildPhase section */ 63 | 64 | /* Begin PBXGroup section */ 65 | 97BCA48719E133F600ACA78B = { 66 | isa = PBXGroup; 67 | children = ( 68 | 97BCA49219E133F600ACA78B /* JieTableView */, 69 | 97BCA4A519E133F600ACA78B /* JieTableViewTests */, 70 | 97BCA49119E133F600ACA78B /* Products */, 71 | ); 72 | sourceTree = ""; 73 | }; 74 | 97BCA49119E133F600ACA78B /* Products */ = { 75 | isa = PBXGroup; 76 | children = ( 77 | 97BCA49019E133F600ACA78B /* JieTableView.app */, 78 | 97BCA4A219E133F600ACA78B /* JieTableViewTests.xctest */, 79 | ); 80 | name = Products; 81 | sourceTree = ""; 82 | }; 83 | 97BCA49219E133F600ACA78B /* JieTableView */ = { 84 | isa = PBXGroup; 85 | children = ( 86 | 978121B519E213E60036AAD0 /* JieMain.storyboard */, 87 | 97BCA49519E133F600ACA78B /* AppDelegate.swift */, 88 | 97BCA4B419E136B600ACA78B /* JieTableViewController.swift */, 89 | 97BCA4B619E140A200ACA78B /* JieTableViewCell.swift */, 90 | 97BCA4BC19E168A100ACA78B /* JieDetailViewController.swift */, 91 | 97BCA49C19E133F600ACA78B /* Images.xcassets */, 92 | 97BCA49319E133F600ACA78B /* Supporting Files */, 93 | ); 94 | path = JieTableView; 95 | sourceTree = ""; 96 | }; 97 | 97BCA49319E133F600ACA78B /* Supporting Files */ = { 98 | isa = PBXGroup; 99 | children = ( 100 | 97BCA4B819E141C100ACA78B /* default_img.png */, 101 | 97BCA49419E133F600ACA78B /* Info.plist */, 102 | 97BCA4BA19E1426F00ACA78B /* videos.plist */, 103 | ); 104 | name = "Supporting Files"; 105 | sourceTree = ""; 106 | }; 107 | 97BCA4A519E133F600ACA78B /* JieTableViewTests */ = { 108 | isa = PBXGroup; 109 | children = ( 110 | 97BCA4A819E133F600ACA78B /* JieTableViewTests.swift */, 111 | 97BCA4A619E133F600ACA78B /* Supporting Files */, 112 | ); 113 | path = JieTableViewTests; 114 | sourceTree = ""; 115 | }; 116 | 97BCA4A619E133F600ACA78B /* Supporting Files */ = { 117 | isa = PBXGroup; 118 | children = ( 119 | 97BCA4A719E133F600ACA78B /* Info.plist */, 120 | ); 121 | name = "Supporting Files"; 122 | sourceTree = ""; 123 | }; 124 | /* End PBXGroup section */ 125 | 126 | /* Begin PBXNativeTarget section */ 127 | 97BCA48F19E133F600ACA78B /* JieTableView */ = { 128 | isa = PBXNativeTarget; 129 | buildConfigurationList = 97BCA4AC19E133F600ACA78B /* Build configuration list for PBXNativeTarget "JieTableView" */; 130 | buildPhases = ( 131 | 97BCA48C19E133F600ACA78B /* Sources */, 132 | 97BCA48D19E133F600ACA78B /* Frameworks */, 133 | 97BCA48E19E133F600ACA78B /* Resources */, 134 | ); 135 | buildRules = ( 136 | ); 137 | dependencies = ( 138 | ); 139 | name = JieTableView; 140 | productName = JieTableView; 141 | productReference = 97BCA49019E133F600ACA78B /* JieTableView.app */; 142 | productType = "com.apple.product-type.application"; 143 | }; 144 | 97BCA4A119E133F600ACA78B /* JieTableViewTests */ = { 145 | isa = PBXNativeTarget; 146 | buildConfigurationList = 97BCA4AF19E133F600ACA78B /* Build configuration list for PBXNativeTarget "JieTableViewTests" */; 147 | buildPhases = ( 148 | 97BCA49E19E133F600ACA78B /* Sources */, 149 | 97BCA49F19E133F600ACA78B /* Frameworks */, 150 | 97BCA4A019E133F600ACA78B /* Resources */, 151 | ); 152 | buildRules = ( 153 | ); 154 | dependencies = ( 155 | 97BCA4A419E133F600ACA78B /* PBXTargetDependency */, 156 | ); 157 | name = JieTableViewTests; 158 | productName = JieTableViewTests; 159 | productReference = 97BCA4A219E133F600ACA78B /* JieTableViewTests.xctest */; 160 | productType = "com.apple.product-type.bundle.unit-test"; 161 | }; 162 | /* End PBXNativeTarget section */ 163 | 164 | /* Begin PBXProject section */ 165 | 97BCA48819E133F600ACA78B /* Project object */ = { 166 | isa = PBXProject; 167 | attributes = { 168 | LastUpgradeCheck = 0600; 169 | ORGANIZATIONNAME = jiezhang; 170 | TargetAttributes = { 171 | 97BCA48F19E133F600ACA78B = { 172 | CreatedOnToolsVersion = 6.0; 173 | }; 174 | 97BCA4A119E133F600ACA78B = { 175 | CreatedOnToolsVersion = 6.0; 176 | TestTargetID = 97BCA48F19E133F600ACA78B; 177 | }; 178 | }; 179 | }; 180 | buildConfigurationList = 97BCA48B19E133F600ACA78B /* Build configuration list for PBXProject "JieTableView" */; 181 | compatibilityVersion = "Xcode 3.2"; 182 | developmentRegion = English; 183 | hasScannedForEncodings = 0; 184 | knownRegions = ( 185 | en, 186 | Base, 187 | ); 188 | mainGroup = 97BCA48719E133F600ACA78B; 189 | productRefGroup = 97BCA49119E133F600ACA78B /* Products */; 190 | projectDirPath = ""; 191 | projectRoot = ""; 192 | targets = ( 193 | 97BCA48F19E133F600ACA78B /* JieTableView */, 194 | 97BCA4A119E133F600ACA78B /* JieTableViewTests */, 195 | ); 196 | }; 197 | /* End PBXProject section */ 198 | 199 | /* Begin PBXResourcesBuildPhase section */ 200 | 97BCA48E19E133F600ACA78B /* Resources */ = { 201 | isa = PBXResourcesBuildPhase; 202 | buildActionMask = 2147483647; 203 | files = ( 204 | 97BCA4BB19E1426F00ACA78B /* videos.plist in Resources */, 205 | 97BCA49D19E133F600ACA78B /* Images.xcassets in Resources */, 206 | 97BCA4B919E141C100ACA78B /* default_img.png in Resources */, 207 | 978121B619E213E60036AAD0 /* JieMain.storyboard in Resources */, 208 | ); 209 | runOnlyForDeploymentPostprocessing = 0; 210 | }; 211 | 97BCA4A019E133F600ACA78B /* Resources */ = { 212 | isa = PBXResourcesBuildPhase; 213 | buildActionMask = 2147483647; 214 | files = ( 215 | ); 216 | runOnlyForDeploymentPostprocessing = 0; 217 | }; 218 | /* End PBXResourcesBuildPhase section */ 219 | 220 | /* Begin PBXSourcesBuildPhase section */ 221 | 97BCA48C19E133F600ACA78B /* Sources */ = { 222 | isa = PBXSourcesBuildPhase; 223 | buildActionMask = 2147483647; 224 | files = ( 225 | 97BCA4B519E136B600ACA78B /* JieTableViewController.swift in Sources */, 226 | 97BCA49619E133F600ACA78B /* AppDelegate.swift in Sources */, 227 | 97BCA4BD19E168A100ACA78B /* JieDetailViewController.swift in Sources */, 228 | 97BCA4B719E140A200ACA78B /* JieTableViewCell.swift in Sources */, 229 | ); 230 | runOnlyForDeploymentPostprocessing = 0; 231 | }; 232 | 97BCA49E19E133F600ACA78B /* Sources */ = { 233 | isa = PBXSourcesBuildPhase; 234 | buildActionMask = 2147483647; 235 | files = ( 236 | 97BCA4A919E133F600ACA78B /* JieTableViewTests.swift in Sources */, 237 | ); 238 | runOnlyForDeploymentPostprocessing = 0; 239 | }; 240 | /* End PBXSourcesBuildPhase section */ 241 | 242 | /* Begin PBXTargetDependency section */ 243 | 97BCA4A419E133F600ACA78B /* PBXTargetDependency */ = { 244 | isa = PBXTargetDependency; 245 | target = 97BCA48F19E133F600ACA78B /* JieTableView */; 246 | targetProxy = 97BCA4A319E133F600ACA78B /* PBXContainerItemProxy */; 247 | }; 248 | /* End PBXTargetDependency section */ 249 | 250 | /* Begin XCBuildConfiguration section */ 251 | 97BCA4AA19E133F600ACA78B /* Debug */ = { 252 | isa = XCBuildConfiguration; 253 | buildSettings = { 254 | ALWAYS_SEARCH_USER_PATHS = NO; 255 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 256 | CLANG_CXX_LIBRARY = "libc++"; 257 | CLANG_ENABLE_MODULES = YES; 258 | CLANG_ENABLE_OBJC_ARC = YES; 259 | CLANG_WARN_BOOL_CONVERSION = YES; 260 | CLANG_WARN_CONSTANT_CONVERSION = YES; 261 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 262 | CLANG_WARN_EMPTY_BODY = YES; 263 | CLANG_WARN_ENUM_CONVERSION = YES; 264 | CLANG_WARN_INT_CONVERSION = YES; 265 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 266 | CLANG_WARN_UNREACHABLE_CODE = YES; 267 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 268 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 269 | COPY_PHASE_STRIP = NO; 270 | ENABLE_STRICT_OBJC_MSGSEND = YES; 271 | GCC_C_LANGUAGE_STANDARD = gnu99; 272 | GCC_DYNAMIC_NO_PIC = NO; 273 | GCC_OPTIMIZATION_LEVEL = 0; 274 | GCC_PREPROCESSOR_DEFINITIONS = ( 275 | "DEBUG=1", 276 | "$(inherited)", 277 | ); 278 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 279 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 280 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 281 | GCC_WARN_UNDECLARED_SELECTOR = YES; 282 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 283 | GCC_WARN_UNUSED_FUNCTION = YES; 284 | GCC_WARN_UNUSED_VARIABLE = YES; 285 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 286 | MTL_ENABLE_DEBUG_INFO = YES; 287 | ONLY_ACTIVE_ARCH = YES; 288 | SDKROOT = iphoneos; 289 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 290 | }; 291 | name = Debug; 292 | }; 293 | 97BCA4AB19E133F600ACA78B /* Release */ = { 294 | isa = XCBuildConfiguration; 295 | buildSettings = { 296 | ALWAYS_SEARCH_USER_PATHS = NO; 297 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 298 | CLANG_CXX_LIBRARY = "libc++"; 299 | CLANG_ENABLE_MODULES = YES; 300 | CLANG_ENABLE_OBJC_ARC = YES; 301 | CLANG_WARN_BOOL_CONVERSION = YES; 302 | CLANG_WARN_CONSTANT_CONVERSION = YES; 303 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 304 | CLANG_WARN_EMPTY_BODY = YES; 305 | CLANG_WARN_ENUM_CONVERSION = YES; 306 | CLANG_WARN_INT_CONVERSION = YES; 307 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 308 | CLANG_WARN_UNREACHABLE_CODE = YES; 309 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 310 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 311 | COPY_PHASE_STRIP = YES; 312 | ENABLE_NS_ASSERTIONS = NO; 313 | ENABLE_STRICT_OBJC_MSGSEND = YES; 314 | GCC_C_LANGUAGE_STANDARD = gnu99; 315 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 316 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 317 | GCC_WARN_UNDECLARED_SELECTOR = YES; 318 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 319 | GCC_WARN_UNUSED_FUNCTION = YES; 320 | GCC_WARN_UNUSED_VARIABLE = YES; 321 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 322 | MTL_ENABLE_DEBUG_INFO = NO; 323 | SDKROOT = iphoneos; 324 | VALIDATE_PRODUCT = YES; 325 | }; 326 | name = Release; 327 | }; 328 | 97BCA4AD19E133F600ACA78B /* Debug */ = { 329 | isa = XCBuildConfiguration; 330 | buildSettings = { 331 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 332 | ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; 333 | INFOPLIST_FILE = JieTableView/Info.plist; 334 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 335 | PRODUCT_NAME = "$(TARGET_NAME)"; 336 | }; 337 | name = Debug; 338 | }; 339 | 97BCA4AE19E133F600ACA78B /* Release */ = { 340 | isa = XCBuildConfiguration; 341 | buildSettings = { 342 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 343 | ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; 344 | INFOPLIST_FILE = JieTableView/Info.plist; 345 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 346 | PRODUCT_NAME = "$(TARGET_NAME)"; 347 | }; 348 | name = Release; 349 | }; 350 | 97BCA4B019E133F600ACA78B /* Debug */ = { 351 | isa = XCBuildConfiguration; 352 | buildSettings = { 353 | BUNDLE_LOADER = "$(TEST_HOST)"; 354 | FRAMEWORK_SEARCH_PATHS = ( 355 | "$(SDKROOT)/Developer/Library/Frameworks", 356 | "$(inherited)", 357 | ); 358 | GCC_PREPROCESSOR_DEFINITIONS = ( 359 | "DEBUG=1", 360 | "$(inherited)", 361 | ); 362 | INFOPLIST_FILE = JieTableViewTests/Info.plist; 363 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 364 | PRODUCT_NAME = "$(TARGET_NAME)"; 365 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/JieTableView.app/JieTableView"; 366 | }; 367 | name = Debug; 368 | }; 369 | 97BCA4B119E133F600ACA78B /* Release */ = { 370 | isa = XCBuildConfiguration; 371 | buildSettings = { 372 | BUNDLE_LOADER = "$(TEST_HOST)"; 373 | FRAMEWORK_SEARCH_PATHS = ( 374 | "$(SDKROOT)/Developer/Library/Frameworks", 375 | "$(inherited)", 376 | ); 377 | INFOPLIST_FILE = JieTableViewTests/Info.plist; 378 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 379 | PRODUCT_NAME = "$(TARGET_NAME)"; 380 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/JieTableView.app/JieTableView"; 381 | }; 382 | name = Release; 383 | }; 384 | /* End XCBuildConfiguration section */ 385 | 386 | /* Begin XCConfigurationList section */ 387 | 97BCA48B19E133F600ACA78B /* Build configuration list for PBXProject "JieTableView" */ = { 388 | isa = XCConfigurationList; 389 | buildConfigurations = ( 390 | 97BCA4AA19E133F600ACA78B /* Debug */, 391 | 97BCA4AB19E133F600ACA78B /* Release */, 392 | ); 393 | defaultConfigurationIsVisible = 0; 394 | defaultConfigurationName = Release; 395 | }; 396 | 97BCA4AC19E133F600ACA78B /* Build configuration list for PBXNativeTarget "JieTableView" */ = { 397 | isa = XCConfigurationList; 398 | buildConfigurations = ( 399 | 97BCA4AD19E133F600ACA78B /* Debug */, 400 | 97BCA4AE19E133F600ACA78B /* Release */, 401 | ); 402 | defaultConfigurationIsVisible = 0; 403 | defaultConfigurationName = Release; 404 | }; 405 | 97BCA4AF19E133F600ACA78B /* Build configuration list for PBXNativeTarget "JieTableViewTests" */ = { 406 | isa = XCConfigurationList; 407 | buildConfigurations = ( 408 | 97BCA4B019E133F600ACA78B /* Debug */, 409 | 97BCA4B119E133F600ACA78B /* Release */, 410 | ); 411 | defaultConfigurationIsVisible = 0; 412 | defaultConfigurationName = Release; 413 | }; 414 | /* End XCConfigurationList section */ 415 | }; 416 | rootObject = 97BCA48819E133F600ACA78B /* Project object */; 417 | } 418 | -------------------------------------------------------------------------------- /JieTableView.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /JieTableView.xcodeproj/project.xcworkspace/xcuserdata/jiezhang.xcuserdatad/UserInterfaceState.xcuserstate: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jwzhangjie/JieTableView/5c9b13c5851d3f12f68fbaadb821767daba48caa/JieTableView.xcodeproj/project.xcworkspace/xcuserdata/jiezhang.xcuserdatad/UserInterfaceState.xcuserstate -------------------------------------------------------------------------------- /JieTableView.xcodeproj/xcuserdata/jiezhang.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | -------------------------------------------------------------------------------- /JieTableView.xcodeproj/xcuserdata/jiezhang.xcuserdatad/xcschemes/JieTableView.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 29 | 35 | 36 | 37 | 38 | 39 | 44 | 45 | 47 | 53 | 54 | 55 | 56 | 57 | 63 | 64 | 65 | 66 | 75 | 76 | 82 | 83 | 84 | 85 | 86 | 87 | 93 | 94 | 100 | 101 | 102 | 103 | 105 | 106 | 109 | 110 | 111 | -------------------------------------------------------------------------------- /JieTableView.xcodeproj/xcuserdata/jiezhang.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | JieTableView.xcscheme 8 | 9 | orderHint 10 | 0 11 | 12 | 13 | SuppressBuildableAutocreation 14 | 15 | 97BCA48F19E133F600ACA78B 16 | 17 | primary 18 | 19 | 20 | 97BCA4A119E133F600ACA78B 21 | 22 | primary 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /JieTableView/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.swift 3 | // JieTableView 4 | // 5 | // Created by jiezhang on 14-10-5. 6 | // Copyright (c) 2014年 jiezhang. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | @UIApplicationMain 12 | class AppDelegate: UIResponder, UIApplicationDelegate { 13 | 14 | var window: UIWindow? 15 | 16 | 17 | func application(application: UIApplication!, didFinishLaunchingWithOptions launchOptions: NSDictionary!) -> Bool { 18 | return true 19 | } 20 | 21 | func applicationWillResignActive(application: UIApplication!) { 22 | // 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. 23 | // 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. 24 | } 25 | 26 | func applicationDidEnterBackground(application: UIApplication!) { 27 | // 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. 28 | // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. 29 | } 30 | 31 | func applicationWillEnterForeground(application: UIApplication!) { 32 | // 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. 33 | } 34 | 35 | func applicationDidBecomeActive(application: UIApplication!) { 36 | // 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. 37 | } 38 | 39 | func applicationWillTerminate(application: UIApplication!) { 40 | // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. 41 | } 42 | 43 | 44 | } 45 | 46 | -------------------------------------------------------------------------------- /JieTableView/Base.lproj/Main.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 29 | 30 | 31 | 32 | 33 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | -------------------------------------------------------------------------------- /JieTableView/Images.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "size" : "29x29", 6 | "scale" : "2x" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "size" : "40x40", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "size" : "60x60", 16 | "scale" : "2x" 17 | }, 18 | { 19 | "idiom" : "iphone", 20 | "size" : "60x60", 21 | "scale" : "3x" 22 | } 23 | ], 24 | "info" : { 25 | "version" : 1, 26 | "author" : "xcode" 27 | } 28 | } -------------------------------------------------------------------------------- /JieTableView/Images.xcassets/LaunchImage.launchimage/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "orientation" : "portrait", 5 | "idiom" : "iphone", 6 | "extent" : "full-screen", 7 | "minimum-system-version" : "7.0", 8 | "scale" : "2x" 9 | }, 10 | { 11 | "orientation" : "portrait", 12 | "idiom" : "iphone", 13 | "subtype" : "retina4", 14 | "extent" : "full-screen", 15 | "minimum-system-version" : "7.0", 16 | "scale" : "2x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /JieTableView/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | jwzhanjgie.$(PRODUCT_NAME:rfc1034identifier) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | APPL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | LSRequiresIPhoneOS 24 | 25 | UIMainStoryboardFile 26 | JieMain 27 | UIRequiredDeviceCapabilities 28 | 29 | armv7 30 | 31 | UISupportedInterfaceOrientations 32 | 33 | UIInterfaceOrientationPortrait 34 | 35 | 36 | 37 | -------------------------------------------------------------------------------- /JieTableView/JieDetailViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // JieDetailViewController.swift 3 | // JieTableView 4 | // 5 | // Created by jiezhang on 14-10-5. 6 | // Copyright (c) 2014年 jiezhang. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import MediaPlayer 11 | 12 | class JieDetailViewController: UIViewController { 13 | 14 | 15 | @IBOutlet var big_video_img: UIImageView! 16 | //接受传进来的值 17 | var detailItem: NSDictionary? 18 | var player:MPMoviePlayerViewController! 19 | 20 | 21 | func configureView() { 22 | if let detail : NSDictionary = self.detailItem { 23 | self.title = detail.objectForKey("video_title") as? String 24 | let url : String = detail.objectForKey("video_img") as String 25 | let dataImg : NSData = NSData(contentsOfURL: NSURL(string : url)) 26 | self.big_video_img.image = UIImage(data: dataImg) 27 | let video_url = NSURL(string: detail.objectForKey("video_url") as String) 28 | player = MPMoviePlayerViewController(contentURL: video_url) 29 | presentViewController(player, animated: true, completion: nil) 30 | } 31 | } 32 | 33 | override func viewDidLoad() { 34 | super.viewDidLoad() 35 | configureView() 36 | } 37 | 38 | override func didReceiveMemoryWarning() { 39 | super.didReceiveMemoryWarning() 40 | // Dispose of any resources that can be recreated. 41 | } 42 | 43 | // MARK: - Navigation 44 | override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) { 45 | 46 | } 47 | 48 | } 49 | -------------------------------------------------------------------------------- /JieTableView/JieMain.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 28 | 29 | 30 | 31 | 32 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | -------------------------------------------------------------------------------- /JieTableView/JieTableViewCell.swift: -------------------------------------------------------------------------------- 1 | // 2 | // JieTableViewCell.swift 3 | // JieTableView 4 | // 5 | // Created by jiezhang on 14-10-5. 6 | // Copyright (c) 2014年 jiezhang. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class JieTableViewCell: UITableViewCell { 12 | 13 | @IBOutlet weak var JieVideoImg: UIImageView! 14 | @IBOutlet weak var JieVideoTitle: UILabel! 15 | @IBOutlet weak var JieVideoSubTitle: UILabel! 16 | 17 | override func awakeFromNib() { 18 | super.awakeFromNib() 19 | // Initialization code 20 | } 21 | 22 | override func setSelected(selected: Bool, animated: Bool) { 23 | super.setSelected(selected, animated: animated) 24 | 25 | 26 | } 27 | 28 | } 29 | -------------------------------------------------------------------------------- /JieTableView/JieTableViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // JieTableViewController.swift 3 | // JieTableView 4 | // 5 | // Created by jiezhang on 14-10-5. 6 | // Copyright (c) 2014年 jiezhang. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class JieTableViewController: UITableViewController { 12 | 13 | var listVideos : NSMutableArray! 14 | 15 | override func viewDidLoad() { 16 | super.viewDidLoad() 17 | var bundle = NSBundle.mainBundle() 18 | let plistPath : String! = bundle.pathForResource("videos", ofType: "plist") 19 | listVideos = NSMutableArray(contentsOfFile: plistPath) 20 | // Uncomment the following line to preserve selection between presentations 21 | // self.clearsSelectionOnViewWillAppear = false 22 | 23 | // Uncomment the following line to display an Edit button in the navigation bar for this view controller. 24 | //下面这段话是设置左边编辑,右边添加item 25 | 26 | self.navigationItem.leftBarButtonItem = self.editButtonItem() 27 | let addButton = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.Add, target: self, action: "insertNewObject:") 28 | self.navigationItem.rightBarButtonItem = addButton 29 | 30 | } 31 | 32 | func insertNewObject(sender: AnyObject) { 33 | var item : NSDictionary = NSDictionary(objects:["http://live.hkstv.hk.lxdns.com/live/hks/playlist.m3u8","http://c.hiphotos.baidu.com/video/pic/item/f703738da977391224eade15fb198618377ae2f2.jpg","新增数据", NSDate.date().description] , forKeys: ["video_img","video_title","video_subTitle","video_url"]) 34 | listVideos.insertObject(item, atIndex: 0) 35 | let indexPath = NSIndexPath(forRow: 0, inSection: 0) 36 | self.tableView.insertRowsAtIndexPaths([indexPath], withRowAnimation: .Automatic) 37 | } 38 | 39 | 40 | override func didReceiveMemoryWarning() { 41 | super.didReceiveMemoryWarning() 42 | // Dispose of any resources that can be recreated. 43 | } 44 | 45 | // MARK: - Table view data source 46 | //返回节的个数 47 | override func numberOfSectionsInTableView(tableView: UITableView) -> Int { 48 | // #warning Potentially incomplete method implementation. 49 | // Return the number of sections. 50 | return 1 51 | } 52 | //返回某个节中的行数 53 | override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 54 | // #warning Incomplete method implementation. 55 | // Return the number of rows in the section. 56 | return listVideos.count 57 | } 58 | //为表视图单元格提供数据,该方法是必须实现的方法 59 | override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 60 | let cellIdentifier : String = "videoItem" 61 | let cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier, forIndexPath: indexPath) as JieTableViewCell 62 | var row = indexPath.row 63 | var rowDict : NSDictionary = listVideos.objectAtIndex(row) as NSDictionary 64 | let url : String = rowDict.objectForKey("video_img") as String 65 | let dataImg : NSData = NSData(contentsOfURL: NSURL(string : url)) 66 | cell.JieVideoImg.image = UIImage(data: dataImg) 67 | cell.JieVideoTitle.text = rowDict.objectForKey("video_title") as? String 68 | cell.JieVideoSubTitle.text = rowDict.objectForKey("video_subTitle") as? String 69 | return cell 70 | 71 | } 72 | 73 | override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 74 | 75 | } 76 | 77 | // 支持单元格编辑功能 78 | override func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool { 79 | // Return NO if you do not want the specified item to be editable. 80 | return true 81 | } 82 | 83 | // Override to support editing the table view. 84 | override func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) { 85 | if editingStyle == .Delete { 86 | // Delete the row from the data source 87 | listVideos.removeObjectAtIndex(indexPath.row) 88 | tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade) 89 | } else if editingStyle == .Insert { 90 | // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view 91 | } 92 | } 93 | 94 | 95 | // Override to support rearranging the table view. 96 | override func tableView(tableView: UITableView, moveRowAtIndexPath fromIndexPath: NSIndexPath, toIndexPath: NSIndexPath) { 97 | if fromIndexPath != toIndexPath{ 98 | var object: AnyObject = listVideos.objectAtIndex(fromIndexPath.row) 99 | listVideos.removeObjectAtIndex(fromIndexPath.row) 100 | if toIndexPath.row > self.listVideos.count{ 101 | self.listVideos.addObject(object) 102 | }else{ 103 | self.listVideos.insertObject(object, atIndex: toIndexPath.row) 104 | } 105 | } 106 | } 107 | 108 | 109 | 110 | // Override to support conditional rearranging of the table view. 111 | //在编辑状态,可以拖动设置item位置 112 | override func tableView(tableView: UITableView, canMoveRowAtIndexPath indexPath: NSIndexPath) -> Bool { 113 | // Return NO if you do not want the item to be re-orderable. 114 | return true 115 | } 116 | 117 | 118 | 119 | // MARK: - Navigation 120 | 121 | //给新进入的界面进行传值 122 | override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) { 123 | if segue.identifier == "showDetail" { 124 | if let indexPath = self.tableView.indexPathForSelectedRow() { 125 | let object : NSDictionary = listVideos[indexPath.row] as NSDictionary 126 | (segue.destinationViewController as JieDetailViewController).detailItem = object 127 | } 128 | } 129 | } 130 | 131 | 132 | 133 | 134 | } 135 | -------------------------------------------------------------------------------- /JieTableView/default_img.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jwzhangjie/JieTableView/5c9b13c5851d3f12f68fbaadb821767daba48caa/JieTableView/default_img.png -------------------------------------------------------------------------------- /JieTableView/videos.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | video_url 7 | http://v.cctv.com/flash/mp4video28/TMS/2013/05/06/265114d5f2e641278098503f1676d017_h264418000nero_aac32-1.mp4 8 | video_img 9 | http://c.hiphotos.baidu.com/video/pic/item/ae51f3deb48f8c545bc3315739292df5e0fe7fb2.jpg 10 | video_title 11 | 艳遇2:小鲜肉 12 | video_subTitle 13 | 邓天晴 刘帅良 14 | 15 | 16 | video_url 17 | rtmp://lm03.everyon.tv:1935/ptv3/phd4 18 | video_img 19 | http://c.hiphotos.baidu.com/video/pic/item/9825bc315c6034a8ee0a64fbc8134954082376e4.jpg 20 | video_title 21 | 小时代3 22 | video_subTitle 23 | 杨幂 郭采洁 24 | 25 | 26 | video_url 27 | rtmp://lm03.everyon.tv:1935/ptv3/phd507 28 | video_img 29 | http://c.hiphotos.baidu.com/video/pic/item/f703738da97739122ee2d869fb198618377ae2f6.jpg 30 | video_title 31 | 医生 32 | video_subTitle 33 | 金昌烷 裴素恩 34 | 35 | 36 | video_url 37 | http://ts.3gv.ifeng.com/live/iphone/zwt/index_multi.m3u8 38 | video_img 39 | http://d.hiphotos.baidu.com/video/pic/item/b3b7d0a20cf431ad9eb56c424836acaf2edd9861.jpg 40 | video_title 41 | 不再说分手 42 | video_subTitle 43 | 郑伊健 周秀娜 44 | 45 | 46 | video_url 47 | http://live.hkstv.hk.lxdns.com/live/hks/playlist.m3u8 48 | video_img 49 | http://c.hiphotos.baidu.com/video/pic/item/f703738da977391224eade15fb198618377ae2f2.jpg 50 | video_title 51 | 夜,女人 52 | video_subTitle 53 | 王淑妍 欧定兴 54 | 55 | 56 | 57 | -------------------------------------------------------------------------------- /JieTableViewTests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | jwzhanjgie.$(PRODUCT_NAME:rfc1034identifier) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | 24 | 25 | -------------------------------------------------------------------------------- /JieTableViewTests/JieTableViewTests.swift: -------------------------------------------------------------------------------- 1 | // 2 | // JieTableViewTests.swift 3 | // JieTableViewTests 4 | // 5 | // Created by jiezhang on 14-10-5. 6 | // Copyright (c) 2014年 jiezhang. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import XCTest 11 | 12 | class JieTableViewTests: XCTestCase { 13 | 14 | override func setUp() { 15 | super.setUp() 16 | // Put setup code here. This method is called before the invocation of each test method in the class. 17 | } 18 | 19 | override func tearDown() { 20 | // Put teardown code here. This method is called after the invocation of each test method in the class. 21 | super.tearDown() 22 | } 23 | 24 | func testExample() { 25 | // This is an example of a functional test case. 26 | XCTAssert(true, "Pass") 27 | } 28 | 29 | func testPerformanceExample() { 30 | // This is an example of a performance test case. 31 | self.measureBlock() { 32 | // Put the code you want to measure the time of here. 33 | } 34 | } 35 | 36 | } 37 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | JieTableView 2 | ============ 3 | --------------------------------------------------------------------------------