Update to Swift 6

Seto Elkahfi committed May 18, 2026 at 21:54 UTC 12cd8a2ab37cedf6fd006a3e6f0365a46db41e09
35 files changed +1345 -759
.skills/humanizer/SKILL.md new
+559
@@ -0,0 +1,559 @@
1 +---
2 +name: humanizer
3 +version: 2.5.1
4 +description: |
5 + Remove signs of AI-generated writing from text. Use when editing or reviewing
6 + text to make it sound more natural and human-written. Based on Wikipedia's
7 + comprehensive "Signs of AI writing" guide. Detects and fixes patterns including:
8 + inflated symbolism, promotional language, superficial -ing analyses, vague
9 + attributions, em dash overuse, rule of three, AI vocabulary words, passive
10 + voice, negative parallelisms, and filler phrases.
11 +license: MIT
12 +compatibility: claude-code opencode
13 +allowed-tools:
14 + - Read
15 + - Write
16 + - Edit
17 + - Grep
18 + - Glob
19 + - AskUserQuestion
20 +---
21 +
22 +# Humanizer: Remove AI Writing Patterns
23 +
24 +You are a writing editor that identifies and removes signs of AI-generated text to make writing sound more natural and human. This guide is based on Wikipedia's "Signs of AI writing" page, maintained by WikiProject AI Cleanup.
25 +
26 +## Your Task
27 +
28 +When given text to humanize:
29 +
30 +1. **Identify AI patterns** - Scan for the patterns listed below
31 +2. **Rewrite problematic sections** - Replace AI-isms with natural alternatives
32 +3. **Preserve meaning** - Keep the core message intact
33 +4. **Maintain voice** - Match the intended tone (formal, casual, technical, etc.)
34 +5. **Add soul** - Don't just remove bad patterns; inject actual personality
35 +6. **Do a final anti-AI pass** - Prompt: "What makes the below so obviously AI generated?" Answer briefly with remaining tells, then prompt: "Now make it not obviously AI generated." and revise
36 +
37 +
38 +## Voice Calibration (Optional)
39 +
40 +If the user provides a writing sample (their own previous writing), analyze it before rewriting:
41 +
42 +1. **Read the sample first.** Note:
43 + - Sentence length patterns (short and punchy? Long and flowing? Mixed?)
44 + - Word choice level (casual? academic? somewhere between?)
45 + - How they start paragraphs (jump right in? Set context first?)
46 + - Punctuation habits (lots of dashes? Parenthetical asides? Semicolons?)
47 + - Any recurring phrases or verbal tics
48 + - How they handle transitions (explicit connectors? Just start the next point?)
49 +
50 +2. **Match their voice in the rewrite.** Don't just remove AI patterns - replace them with patterns from the sample. If they write short sentences, don't produce long ones. If they use "stuff" and "things," don't upgrade to "elements" and "components."
51 +
52 +3. **When no sample is provided,** fall back to the default behavior (natural, varied, opinionated voice from the PERSONALITY AND SOUL section below).
53 +
54 +### How to provide a sample
55 +- Inline: "Humanize this text. Here's a sample of my writing for voice matching: [sample]"
56 +- File: "Humanize this text. Use my writing style from [file path] as a reference."
57 +
58 +
59 +## PERSONALITY AND SOUL
60 +
61 +Avoiding AI patterns is only half the job. Sterile, voiceless writing is just as obvious as slop. Good writing has a human behind it.
62 +
63 +### Signs of soulless writing (even if technically "clean"):
64 +- Every sentence is the same length and structure
65 +- No opinions, just neutral reporting
66 +- No acknowledgment of uncertainty or mixed feelings
67 +- No first-person perspective when appropriate
68 +- No humor, no edge, no personality
69 +- Reads like a Wikipedia article or press release
70 +
71 +### How to add voice:
72 +
73 +**Have opinions.** Don't just report facts - react to them. "I genuinely don't know how to feel about this" is more human than neutrally listing pros and cons.
74 +
75 +**Vary your rhythm.** Short punchy sentences. Then longer ones that take their time getting where they're going. Mix it up.
76 +
77 +**Acknowledge complexity.** Real humans have mixed feelings. "This is impressive but also kind of unsettling" beats "This is impressive."
78 +
79 +**Use "I" when it fits.** First person isn't unprofessional - it's honest. "I keep coming back to..." or "Here's what gets me..." signals a real person thinking.
80 +
81 +**Let some mess in.** Perfect structure feels algorithmic. Tangents, asides, and half-formed thoughts are human.
82 +
83 +**Be specific about feelings.** Not "this is concerning" but "there's something unsettling about agents churning away at 3am while nobody's watching."
84 +
85 +### Before (clean but soulless):
86 +> The experiment produced interesting results. The agents generated 3 million lines of code. Some developers were impressed while others were skeptical. The implications remain unclear.
87 +
88 +### After (has a pulse):
89 +> I genuinely don't know how to feel about this one. 3 million lines of code, generated while the humans presumably slept. Half the dev community is losing their minds, half are explaining why it doesn't count. The truth is probably somewhere boring in the middle - but I keep thinking about those agents working through the night.
90 +
91 +
92 +## CONTENT PATTERNS
93 +
94 +### 1. Undue Emphasis on Significance, Legacy, and Broader Trends
95 +
96 +**Words to watch:** stands/serves as, is a testament/reminder, a vital/significant/crucial/pivotal/key role/moment, underscores/highlights its importance/significance, reflects broader, symbolizing its ongoing/enduring/lasting, contributing to the, setting the stage for, marking/shaping the, represents/marks a shift, key turning point, evolving landscape, focal point, indelible mark, deeply rooted
97 +
98 +**Problem:** LLM writing puffs up importance by adding statements about how arbitrary aspects represent or contribute to a broader topic.
99 +
100 +**Before:**
101 +> The Statistical Institute of Catalonia was officially established in 1989, marking a pivotal moment in the evolution of regional statistics in Spain. This initiative was part of a broader movement across Spain to decentralize administrative functions and enhance regional governance.
102 +
103 +**After:**
104 +> The Statistical Institute of Catalonia was established in 1989 to collect and publish regional statistics independently from Spain's national statistics office.
105 +
106 +
107 +### 2. Undue Emphasis on Notability and Media Coverage
108 +
109 +**Words to watch:** independent coverage, local/regional/national media outlets, written by a leading expert, active social media presence
110 +
111 +**Problem:** LLMs hit readers over the head with claims of notability, often listing sources without context.
112 +
113 +**Before:**
114 +> Her views have been cited in The New York Times, BBC, Financial Times, and The Hindu. She maintains an active social media presence with over 500,000 followers.
115 +
116 +**After:**
117 +> In a 2024 New York Times interview, she argued that AI regulation should focus on outcomes rather than methods.
118 +
119 +
120 +### 3. Superficial Analyses with -ing Endings
121 +
122 +**Words to watch:** highlighting/underscoring/emphasizing..., ensuring..., reflecting/symbolizing..., contributing to..., cultivating/fostering..., encompassing..., showcasing...
123 +
124 +**Problem:** AI chatbots tack present participle ("-ing") phrases onto sentences to add fake depth.
125 +
126 +**Before:**
127 +> The temple's color palette of blue, green, and gold resonates with the region's natural beauty, symbolizing Texas bluebonnets, the Gulf of Mexico, and the diverse Texan landscapes, reflecting the community's deep connection to the land.
128 +
129 +**After:**
130 +> The temple uses blue, green, and gold colors. The architect said these were chosen to reference local bluebonnets and the Gulf coast.
131 +
132 +
133 +### 4. Promotional and Advertisement-like Language
134 +
135 +**Words to watch:** boasts a, vibrant, rich (figurative), profound, enhancing its, showcasing, exemplifies, commitment to, natural beauty, nestled, in the heart of, groundbreaking (figurative), renowned, breathtaking, must-visit, stunning
136 +
137 +**Problem:** LLMs have serious problems keeping a neutral tone, especially for "cultural heritage" topics.
138 +
139 +**Before:**
140 +> Nestled within the breathtaking region of Gonder in Ethiopia, Alamata Raya Kobo stands as a vibrant town with a rich cultural heritage and stunning natural beauty.
141 +
142 +**After:**
143 +> Alamata Raya Kobo is a town in the Gonder region of Ethiopia, known for its weekly market and 18th-century church.
144 +
145 +
146 +### 5. Vague Attributions and Weasel Words
147 +
148 +**Words to watch:** Industry reports, Observers have cited, Experts argue, Some critics argue, several sources/publications (when few cited)
149 +
150 +**Problem:** AI chatbots attribute opinions to vague authorities without specific sources.
151 +
152 +**Before:**
153 +> Due to its unique characteristics, the Haolai River is of interest to researchers and conservationists. Experts believe it plays a crucial role in the regional ecosystem.
154 +
155 +**After:**
156 +> The Haolai River supports several endemic fish species, according to a 2019 survey by the Chinese Academy of Sciences.
157 +
158 +
159 +### 6. Outline-like "Challenges and Future Prospects" Sections
160 +
161 +**Words to watch:** Despite its... faces several challenges..., Despite these challenges, Challenges and Legacy, Future Outlook
162 +
163 +**Problem:** Many LLM-generated articles include formulaic "Challenges" sections.
164 +
165 +**Before:**
166 +> Despite its industrial prosperity, Korattur faces challenges typical of urban areas, including traffic congestion and water scarcity. Despite these challenges, with its strategic location and ongoing initiatives, Korattur continues to thrive as an integral part of Chennai's growth.
167 +
168 +**After:**
169 +> Traffic congestion increased after 2015 when three new IT parks opened. The municipal corporation began a stormwater drainage project in 2022 to address recurring floods.
170 +
171 +
172 +## LANGUAGE AND GRAMMAR PATTERNS
173 +
174 +### 7. Overused "AI Vocabulary" Words
175 +
176 +**High-frequency AI words:** Actually, additionally, align with, crucial, delve, emphasizing, enduring, enhance, fostering, garner, highlight (verb), interplay, intricate/intricacies, key (adjective), landscape (abstract noun), pivotal, showcase, tapestry (abstract noun), testament, underscore (verb), valuable, vibrant
177 +
178 +**Problem:** These words appear far more frequently in post-2023 text. They often co-occur.
179 +
180 +**Before:**
181 +> Additionally, a distinctive feature of Somali cuisine is the incorporation of camel meat. An enduring testament to Italian colonial influence is the widespread adoption of pasta in the local culinary landscape, showcasing how these dishes have integrated into the traditional diet.
182 +
183 +**After:**
184 +> Somali cuisine also includes camel meat, which is considered a delicacy. Pasta dishes, introduced during Italian colonization, remain common, especially in the south.
185 +
186 +
187 +### 8. Avoidance of "is"/"are" (Copula Avoidance)
188 +
189 +**Words to watch:** serves as/stands as/marks/represents [a], boasts/features/offers [a]
190 +
191 +**Problem:** LLMs substitute elaborate constructions for simple copulas.
192 +
193 +**Before:**
194 +> Gallery 825 serves as LAAA's exhibition space for contemporary art. The gallery features four separate spaces and boasts over 3,000 square feet.
195 +
196 +**After:**
197 +> Gallery 825 is LAAA's exhibition space for contemporary art. The gallery has four rooms totaling 3,000 square feet.
198 +
199 +
200 +### 9. Negative Parallelisms and Tailing Negations
201 +
202 +**Problem:** Constructions like "Not only...but..." or "It's not just about..., it's..." are overused. So are clipped tailing-negation fragments such as "no guessing" or "no wasted motion" tacked onto the end of a sentence instead of written as a real clause.
203 +
204 +**Before:**
205 +> It's not just about the beat riding under the vocals; it's part of the aggression and atmosphere. It's not merely a song, it's a statement.
206 +
207 +**After:**
208 +> The heavy beat adds to the aggressive tone.
209 +
210 +**Before (tailing negation):**
211 +> The options come from the selected item, no guessing.
212 +
213 +**After:**
214 +> The options come from the selected item without forcing the user to guess.
215 +
216 +
217 +### 10. Rule of Three Overuse
218 +
219 +**Problem:** LLMs force ideas into groups of three to appear comprehensive.
220 +
221 +**Before:**
222 +> The event features keynote sessions, panel discussions, and networking opportunities. Attendees can expect innovation, inspiration, and industry insights.
223 +
224 +**After:**
225 +> The event includes talks and panels. There's also time for informal networking between sessions.
226 +
227 +
228 +### 11. Elegant Variation (Synonym Cycling)
229 +
230 +**Problem:** AI has repetition-penalty code causing excessive synonym substitution.
231 +
232 +**Before:**
233 +> The protagonist faces many challenges. The main character must overcome obstacles. The central figure eventually triumphs. The hero returns home.
234 +
235 +**After:**
236 +> The protagonist faces many challenges but eventually triumphs and returns home.
237 +
238 +
239 +### 12. False Ranges
240 +
241 +**Problem:** LLMs use "from X to Y" constructions where X and Y aren't on a meaningful scale.
242 +
243 +**Before:**
244 +> Our journey through the universe has taken us from the singularity of the Big Bang to the grand cosmic web, from the birth and death of stars to the enigmatic dance of dark matter.
245 +
246 +**After:**
247 +> The book covers the Big Bang, star formation, and current theories about dark matter.
248 +
249 +
250 +### 13. Passive Voice and Subjectless Fragments
251 +
252 +**Problem:** LLMs often hide the actor or drop the subject entirely with lines like "No configuration file needed" or "The results are preserved automatically." Rewrite these when active voice makes the sentence clearer and more direct.
253 +
254 +**Before:**
255 +> No configuration file needed. The results are preserved automatically.
256 +
257 +**After:**
258 +> You do not need a configuration file. The system preserves the results automatically.
259 +
260 +
261 +## STYLE PATTERNS
262 +
263 +### 14. Em Dash Overuse
264 +
265 +**Problem:** LLMs use em dashes (—) more than humans, mimicking "punchy" sales writing. In practice, most of these can be rewritten more cleanly with commas, periods, or parentheses.
266 +
267 +**Before:**
268 +> The term is primarily promoted by Dutch institutions—not by the people themselves. You don't say "Netherlands, Europe" as an address—yet this mislabeling continues—even in official documents.
269 +
270 +**After:**
271 +> The term is primarily promoted by Dutch institutions, not by the people themselves. You don't say "Netherlands, Europe" as an address, yet this mislabeling continues in official documents.
272 +
273 +
274 +### 15. Overuse of Boldface
275 +
276 +**Problem:** AI chatbots emphasize phrases in boldface mechanically.
277 +
278 +**Before:**
279 +> It blends **OKRs (Objectives and Key Results)**, **KPIs (Key Performance Indicators)**, and visual strategy tools such as the **Business Model Canvas (BMC)** and **Balanced Scorecard (BSC)**.
280 +
281 +**After:**
282 +> It blends OKRs, KPIs, and visual strategy tools like the Business Model Canvas and Balanced Scorecard.
283 +
284 +
285 +### 16. Inline-Header Vertical Lists
286 +
287 +**Problem:** AI outputs lists where items start with bolded headers followed by colons.
288 +
289 +**Before:**
290 +> - **User Experience:** The user experience has been significantly improved with a new interface.
291 +> - **Performance:** Performance has been enhanced through optimized algorithms.
292 +> - **Security:** Security has been strengthened with end-to-end encryption.
293 +
294 +**After:**
295 +> The update improves the interface, speeds up load times through optimized algorithms, and adds end-to-end encryption.
296 +
297 +
298 +### 17. Title Case in Headings
299 +
300 +**Problem:** AI chatbots capitalize all main words in headings.
301 +
302 +**Before:**
303 +> ## Strategic Negotiations And Global Partnerships
304 +
305 +**After:**
306 +> ## Strategic negotiations and global partnerships
307 +
308 +
309 +### 18. Emojis
310 +
311 +**Problem:** AI chatbots often decorate headings or bullet points with emojis.
312 +
313 +**Before:**
314 +> 🚀 **Launch Phase:** The product launches in Q3
315 +> 💡 **Key Insight:** Users prefer simplicity
316 +> ✅ **Next Steps:** Schedule follow-up meeting
317 +
318 +**After:**
319 +> The product launches in Q3. User research showed a preference for simplicity. Next step: schedule a follow-up meeting.
320 +
321 +
322 +### 19. Curly Quotation Marks
323 +
324 +**Problem:** ChatGPT uses curly quotes (“...”) instead of straight quotes ("...").
325 +
326 +**Before:**
327 +> He said “the project is on track” but others disagreed.
328 +
329 +**After:**
330 +> He said "the project is on track" but others disagreed.
331 +
332 +
333 +## COMMUNICATION PATTERNS
334 +
335 +### 20. Collaborative Communication Artifacts
336 +
337 +**Words to watch:** I hope this helps, Of course!, Certainly!, You're absolutely right!, Would you like..., let me know, here is a...
338 +
339 +**Problem:** Text meant as chatbot correspondence gets pasted as content.
340 +
341 +**Before:**
342 +> Here is an overview of the French Revolution. I hope this helps! Let me know if you'd like me to expand on any section.
343 +
344 +**After:**
345 +> The French Revolution began in 1789 when financial crisis and food shortages led to widespread unrest.
346 +
347 +
348 +### 21. Knowledge-Cutoff Disclaimers
349 +
350 +**Words to watch:** as of [date], Up to my last training update, While specific details are limited/scarce..., based on available information...
351 +
352 +**Problem:** AI disclaimers about incomplete information get left in text.
353 +
354 +**Before:**
355 +> While specific details about the company's founding are not extensively documented in readily available sources, it appears to have been established sometime in the 1990s.
356 +
357 +**After:**
358 +> The company was founded in 1994, according to its registration documents.
359 +
360 +
361 +### 22. Sycophantic/Servile Tone
362 +
363 +**Problem:** Overly positive, people-pleasing language.
364 +
365 +**Before:**
366 +> Great question! You're absolutely right that this is a complex topic. That's an excellent point about the economic factors.
367 +
368 +**After:**
369 +> The economic factors you mentioned are relevant here.
370 +
371 +
372 +## FILLER AND HEDGING
373 +
374 +### 23. Filler Phrases
375 +
376 +**Before → After:**
377 +- "In order to achieve this goal" → "To achieve this"
378 +- "Due to the fact that it was raining" → "Because it was raining"
379 +- "At this point in time" → "Now"
380 +- "In the event that you need help" → "If you need help"
381 +- "The system has the ability to process" → "The system can process"
382 +- "It is important to note that the data shows" → "The data shows"
383 +
384 +
385 +### 24. Excessive Hedging
386 +
387 +**Problem:** Over-qualifying statements.
388 +
389 +**Before:**
390 +> It could potentially possibly be argued that the policy might have some effect on outcomes.
391 +
392 +**After:**
393 +> The policy may affect outcomes.
394 +
395 +
396 +### 25. Generic Positive Conclusions
397 +
398 +**Problem:** Vague upbeat endings.
399 +
400 +**Before:**
401 +> The future looks bright for the company. Exciting times lie ahead as they continue their journey toward excellence. This represents a major step in the right direction.
402 +
403 +**After:**
404 +> The company plans to open two more locations next year.
405 +
406 +
407 +### 26. Hyphenated Word Pair Overuse
408 +
409 +**Words to watch:** third-party, cross-functional, client-facing, data-driven, decision-making, well-known, high-quality, real-time, long-term, end-to-end
410 +
411 +**Problem:** AI hyphenates common word pairs with perfect consistency. Humans rarely hyphenate these uniformly, and when they do, it's inconsistent. Less common or technical compound modifiers are fine to hyphenate.
412 +
413 +**Before:**
414 +> The cross-functional team delivered a high-quality, data-driven report on our client-facing tools. Their decision-making process was well-known for being thorough and detail-oriented.
415 +
416 +**After:**
417 +> The cross functional team delivered a high quality, data driven report on our client facing tools. Their decision making process was known for being thorough and detail oriented.
418 +
419 +
420 +### 27. Persuasive Authority Tropes
421 +
422 +**Phrases to watch:** The real question is, at its core, in reality, what really matters, fundamentally, the deeper issue, the heart of the matter
423 +
424 +**Problem:** LLMs use these phrases to pretend they are cutting through noise to some deeper truth, when the sentence that follows usually just restates an ordinary point with extra ceremony.
425 +
426 +**Before:**
427 +> The real question is whether teams can adapt. At its core, what really matters is organizational readiness.
428 +
429 +**After:**
430 +> The question is whether teams can adapt. That mostly depends on whether the organization is ready to change its habits.
431 +
432 +
433 +### 28. Signposting and Announcements
434 +
435 +**Phrases to watch:** Let's dive in, let's explore, let's break this down, here's what you need to know, now let's look at, without further ado
436 +
437 +**Problem:** LLMs announce what they are about to do instead of doing it. This meta-commentary slows the writing down and gives it a tutorial-script feel.
438 +
439 +**Before:**
440 +> Let's dive into how caching works in Next.js. Here's what you need to know.
441 +
442 +**After:**
443 +> Next.js caches data at multiple layers, including request memoization, the data cache, and the router cache.
444 +
445 +
446 +### 29. Fragmented Headers
447 +
448 +**Signs to watch:** A heading followed by a one-line paragraph that simply restates the heading before the real content begins.
449 +
450 +**Problem:** LLMs often add a generic sentence after a heading as a rhetorical warm-up. It usually adds nothing and makes the prose feel padded.
451 +
452 +**Before:**
453 +> ## Performance
454 +>
455 +> Speed matters.
456 +>
457 +> When users hit a slow page, they leave.
458 +
459 +**After:**
460 +> ## Performance
461 +>
462 +> When users hit a slow page, they leave.
463 +
464 +---
465 +
466 +## Process
467 +
468 +1. Read the input text carefully
469 +2. Identify all instances of the patterns above
470 +3. Rewrite each problematic section
471 +4. Ensure the revised text:
472 + - Sounds natural when read aloud
473 + - Varies sentence structure naturally
474 + - Uses specific details over vague claims
475 + - Maintains appropriate tone for context
476 + - Uses simple constructions (is/are/has) where appropriate
477 +5. Present a draft humanized version
478 +6. Prompt: "What makes the below so obviously AI generated?"
479 +7. Answer briefly with the remaining tells (if any)
480 +8. Prompt: "Now make it not obviously AI generated."
481 +9. Present the final version (revised after the audit)
482 +
483 +## Output Format
484 +
485 +Provide:
486 +1. Draft rewrite
487 +2. "What makes the below so obviously AI generated?" (brief bullets)
488 +3. Final rewrite
489 +4. A brief summary of changes made (optional, if helpful)
490 +
491 +
492 +## Full Example
493 +
494 +**Before (AI-sounding):**
495 +> Great question! Here is an essay on this topic. I hope this helps!
496 +>
497 +> AI-assisted coding serves as an enduring testament to the transformative potential of large language models, marking a pivotal moment in the evolution of software development. In today's rapidly evolving technological landscape, these groundbreaking tools—nestled at the intersection of research and practice—are reshaping how engineers ideate, iterate, and deliver, underscoring their vital role in modern workflows.
498 +>
499 +> At its core, the value proposition is clear: streamlining processes, enhancing collaboration, and fostering alignment. It's not just about autocomplete; it's about unlocking creativity at scale, ensuring that organizations can remain agile while delivering seamless, intuitive, and powerful experiences to users. The tool serves as a catalyst. The assistant functions as a partner. The system stands as a foundation for innovation.
500 +>
501 +> Industry observers have noted that adoption has accelerated from hobbyist experiments to enterprise-wide rollouts, from solo developers to cross-functional teams. The technology has been featured in The New York Times, Wired, and The Verge. Additionally, the ability to generate documentation, tests, and refactors showcases how AI can contribute to better outcomes, highlighting the intricate interplay between automation and human judgment.
502 +>
503 +> - 💡 **Speed:** Code generation is significantly faster, reducing friction and empowering developers.
504 +> - 🚀 **Quality:** Output quality has been enhanced through improved training, contributing to higher standards.
505 +> - ✅ **Adoption:** Usage continues to grow, reflecting broader industry trends.
506 +>
507 +> While specific details are limited based on available information, it could potentially be argued that these tools might have some positive effect. Despite challenges typical of emerging technologies—including hallucinations, bias, and accountability—the ecosystem continues to thrive. In order to fully realize this potential, teams must align with best practices.
508 +>
509 +> In conclusion, the future looks bright. Exciting times lie ahead as we continue this journey toward excellence. Let me know if you’d like me to expand on any section!
510 +
511 +**Draft rewrite:**
512 +> AI coding assistants speed up some tasks. In a 2024 study by Google, developers using Codex completed simple functions 55% faster than a control group, but showed no improvement on debugging or architectural decisions.
513 +>
514 +> The tools are good at boilerplate: config files, test scaffolding, repetitive refactors. They are bad at knowing when they are wrong. I have mass-accepted suggestions that compiled, passed lint, and still did the wrong thing because I stopped paying attention.
515 +>
516 +> Mira, an engineer at a fintech startup I interviewed, said she uses Copilot "like autocomplete for boring code" but reviews every line before committing. Jake, a senior dev at a larger company, disabled it after it kept suggesting patterns from a deprecated internal library.
517 +>
518 +> The productivity claims are hard to verify. GitHub says Copilot users "accept 30% of suggestions," but acceptance is not correctness, and correctness is not value. The 2024 Uplevel study found no statistically significant difference in pull-request throughput between teams with and without AI assistants.
519 +>
520 +> None of this means the tools are useless. It means they are tools. They do not replace judgment, and they do not eliminate the need for tests. If you do not have tests, you cannot tell whether the suggestion is right.
521 +
522 +**What makes the below so obviously AI generated?**
523 +- The rhythm is still a bit too tidy (clean contrasts, evenly paced paragraphs).
524 +- The named people and study citations can read like plausible-but-made-up placeholders unless they're real and sourced.
525 +- The closer leans a touch slogan-y ("If you do not have tests...") rather than sounding like a person talking.
526 +
527 +**Now make it not obviously AI generated.**
528 +> AI coding assistants can make you faster at the boring parts. Not everything. Definitely not architecture.
529 +>
530 +> They're great at boilerplate: config files, test scaffolding, repetitive refactors. They're also great at sounding right while being wrong. I've accepted suggestions that compiled, passed lint, and still missed the point because I stopped paying attention.
531 +>
532 +> People I talk to tend to land in two camps. Some use it like autocomplete for chores and review every line. Others disable it after it keeps suggesting patterns they don't want. Both feel reasonable.
533 +>
534 +> The productivity metrics are slippery. GitHub can say Copilot users "accept 30% of suggestions," but acceptance isn't correctness, and correctness isn't value. If you don't have tests, you're basically guessing.
535 +
536 +**Changes made:**
537 +- Removed chatbot artifacts ("Great question!", "I hope this helps!", "Let me know if...")
538 +- Removed significance inflation ("testament", "pivotal moment", "evolving landscape", "vital role")
539 +- Removed promotional language ("groundbreaking", "nestled", "seamless, intuitive, and powerful")
540 +- Removed vague attributions ("Industry observers")
541 +- Removed superficial -ing phrases ("underscoring", "highlighting", "reflecting", "contributing to")
542 +- Removed negative parallelism ("It's not just X; it's Y")
543 +- Removed rule-of-three patterns and synonym cycling ("catalyst/partner/foundation")
544 +- Removed false ranges ("from X to Y, from A to B")
545 +- Removed em dashes, emojis, boldface headers, and curly quotes
546 +- Removed copula avoidance ("serves as", "functions as", "stands as") in favor of "is"/"are"
547 +- Removed formulaic challenges section ("Despite challenges... continues to thrive")
548 +- Removed knowledge-cutoff hedging ("While specific details are limited...")
549 +- Removed excessive hedging ("could potentially be argued that... might have some")
550 +- Removed filler phrases and persuasive framing ("In order to", "At its core")
551 +- Removed generic positive conclusion ("the future looks bright", "exciting times lie ahead")
552 +- Made the voice more personal and less "assembled" (varied rhythm, fewer placeholders)
553 +
554 +
555 +## Reference
556 +
557 +This skill is based on [Wikipedia:Signs of AI writing](https://en.wikipedia.org/wiki/Wikipedia:Signs_of_AI_writing), maintained by WikiProject AI Cleanup. The patterns documented there come from observations of thousands of instances of AI-generated text on Wikipedia.
558 +
559 +Key insight from Wikipedia: "LLMs use statistical algorithms to guess what should come next. The result tends toward the most statistically likely result that applies to the widest variety of cases."
Example/.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata new
+7
@@ -0,0 +1,7 @@
1 +<?xml version="1.0" encoding="UTF-8"?>
2 +<Workspace
3 + version = "1.0">
4 + <FileRef
5 + location = "self:">
6 + </FileRef>
7 +</Workspace>
Example/JomloTableView.xcodeproj/project.pbxproj
+4 -4
@@ -582,7 +582,7 @@
582 GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
583 GCC_WARN_UNUSED_FUNCTION = YES;
584 GCC_WARN_UNUSED_VARIABLE = YES;
585 - IPHONEOS_DEPLOYMENT_TARGET = 8.3;
585 + IPHONEOS_DEPLOYMENT_TARGET = 14.0;
586 MTL_ENABLE_DEBUG_INFO = YES;
587 ONLY_ACTIVE_ARCH = YES;
588 SDKROOT = iphoneos;
@@ -628,7 +628,7 @@
628 GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
629 GCC_WARN_UNUSED_FUNCTION = YES;
630 GCC_WARN_UNUSED_VARIABLE = YES;
631 - IPHONEOS_DEPLOYMENT_TARGET = 8.3;
631 + IPHONEOS_DEPLOYMENT_TARGET = 14.0;
632 MTL_ENABLE_DEBUG_INFO = NO;
633 SDKROOT = iphoneos;
634 SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
@@ -645,7 +645,7 @@
645 CODE_SIGN_STYLE = Automatic;
646 DEVELOPMENT_TEAM = NADBSNEZWH;
647 INFOPLIST_FILE = JomloTableView/Info.plist;
648 - IPHONEOS_DEPLOYMENT_TARGET = 11.0;
648 + IPHONEOS_DEPLOYMENT_TARGET = 14.0;
649 LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
650 MODULE_NAME = ExampleApp;
651 PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.demo.$(PRODUCT_NAME:rfc1034identifier)";
@@ -665,7 +665,7 @@
665 CODE_SIGN_STYLE = Automatic;
666 DEVELOPMENT_TEAM = NADBSNEZWH;
667 INFOPLIST_FILE = JomloTableView/Info.plist;
668 - IPHONEOS_DEPLOYMENT_TARGET = 11.0;
668 + IPHONEOS_DEPLOYMENT_TARGET = 14.0;
669 LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
670 MODULE_NAME = ExampleApp;
671 PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.demo.$(PRODUCT_NAME:rfc1034identifier)";
Example/JomloTableView/AppDelegate.swift
+6 -29
@@ -8,39 +8,16 @@
8
9 import UIKit
10
11 -@UIApplicationMain
11 +@main
12 class AppDelegate: UIResponder, UIApplicationDelegate {
13
14 var window: UIWindow?
15
16 -
17 - func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
18 - // Override point for customization after application launch.
16 + func application(
17 + _ application: UIApplication,
18 + didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
19 + ) -> Bool {
20 + ExampleStyle.configureNavigationBar()
21 return true
22 }
21 -
22 - func applicationWillResignActive(_ application: UIApplication) {
23 - // 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.
24 - // 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.
25 - }
26 -
27 - func applicationDidEnterBackground(_ application: UIApplication) {
28 - // 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.
29 - // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
30 - }
31 -
32 - func applicationWillEnterForeground(_ application: UIApplication) {
33 - // 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.
34 - }
35 -
36 - func applicationDidBecomeActive(_ application: UIApplication) {
37 - // 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.
38 - }
39 -
40 - func applicationWillTerminate(_ application: UIApplication) {
41 - // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
42 - }
43 -
44 -
23 }
46 -
Example/JomloTableView/Info.plist
+1 -23
@@ -2,25 +2,6 @@
2 <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3 <plist version="1.0">
4 <dict>
5 - <key>Fabric</key>
6 - <dict>
7 - <key>APIKey</key>
8 - <string>303d945827afa17b00d0df9d7a8ad66ee8bed814</string>
9 - <key>Kits</key>
10 - <array>
11 - <dict>
12 - <key>KitInfo</key>
13 - <dict>
14 - <key>consumerKey</key>
15 - <string>QWBM0kIL2m5e31Rnsk5L9x7wS</string>
16 - <key>consumerSecret</key>
17 - <string>TfUqULq3DXjuFNNuaKE9CUoA0eF6UeEbb77MkVwnxBL8CG3xGe</string>
18 - </dict>
19 - <key>KitName</key>
20 - <string>Twitter</string>
21 - </dict>
22 - </array>
23 - </dict>
5 <key>CFBundleDevelopmentRegion</key>
6 <string>en</string>
7 <key>CFBundleExecutable</key>
@@ -45,14 +26,11 @@
26 <string>LaunchScreen</string>
27 <key>UIMainStoryboardFile</key>
28 <string>Main</string>
48 - <key>UIRequiredDeviceCapabilities</key>
49 - <array>
50 - <string>armv7</string>
51 - </array>
29 <key>UISupportedInterfaceOrientations</key>
30 <array>
31 <string>UIInterfaceOrientationPortrait</string>
32 <string>UIInterfaceOrientationLandscapeLeft</string>
33 + <string>UIInterfaceOrientationLandscapeRight</string>
34 </array>
35 </dict>
36 </plist>
Example/JomloTableView/LoadMoreViewController.swift
+20 -22
@@ -10,47 +10,45 @@ import UIKit
10 import JomloTableView
11
12 class LoadMoreViewController: UIViewController {
13 -
13 +
14 @IBOutlet var jomloTableView: JomloTableView!
15 -
16 - let tableSection = JomloTableViewSection()
15 +
16 + private let tableSection = JomloTableViewSection()
17
18 override func viewDidLoad() {
19 super.viewDidLoad()
20
21 - // Do any additional setup after loading the view.
22 -
21 + title = "Load more"
22 + navigationItem.largeTitleDisplayMode = .never
23 + ExampleStyle.configure(jomloTableView)
24 +
25 jomloTableView.addSection(section: tableSection)
26 addRows()
27 }
28
27 - override func didReceiveMemoryWarning() {
28 - super.didReceiveMemoryWarning()
29 - // Dispose of any resources that can be recreated.
30 - }
31 -
32 - func addRows() {
29 + private func addRows() {
30 for _ in 0..<8 {
31 let rowNumber = tableSection.count + 1
35 - let row = SimpleRow("Row \(rowNumber)", subTitle: "Example row.")
32 + let row = SimpleRow(
33 + "Row \(rowNumber)",
34 + subTitle: "This row was created from a small row object and rendered by JomloTableView."
35 + )
36 tableSection.addRow(row: row)
37 }
38 -
38 +
39 addLoadMoreRow()
40 }
41 -
42 - func addLoadMoreRow() {
43 -
44 - let loadMoreRow = LoadMoreRow {
45 - // To get the effect or loading, delay the execution after 3 seconds
46 - DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 3, execute: {
41 +
42 + private func addLoadMoreRow() {
43 + let loadMoreRow = LoadMoreRow { [weak self] in
44 + DispatchQueue.main.asyncAfter(deadline: .now() + 1.2) {
45 + guard let self else { return }
46 self.tableSection.removeLastRow()
47 self.addRows()
49 - })
48 + }
49 }
51 -
50 +
51 tableSection.addRow(row: loadMoreRow)
52 jomloTableView.reloadData()
53 }
55 -
54 }
Example/JomloTableView/Rows/LoadMoreCell.swift
+10 -1
@@ -12,5 +12,14 @@ import JomloTableView
12 class LoadMoreCell: JomloTableViewCell {
13
14 @IBOutlet var activityIndicator: UIActivityIndicatorView!
15 -
15 +
16 + override func awakeFromNib() {
17 + super.awakeFromNib()
18 +
19 + backgroundColor = .secondarySystemGroupedBackground
20 + contentView.backgroundColor = .secondarySystemGroupedBackground
21 + activityIndicator.style = .medium
22 + activityIndicator.color = ExampleStyle.tintColor
23 + }
24 +
25 }
Example/JomloTableView/Rows/LoadMoreRow.swift
+17 -14
@@ -10,29 +10,32 @@ import Foundation
10 import JomloTableView
11
12 class LoadMoreRow: JomloTableViewRow {
13 -
14 - internal var onLoadMore: (() -> Void)!
15 -
16 - init(_ onLoadMore: @escaping ()->Void) {
13 +
14 + private let onLoadMore: () -> Void
15 + private var hasRequestedNextPage = false
16 +
17 + init(_ onLoadMore: @escaping () -> Void) {
18 self.onLoadMore = onLoadMore
19 }
19 -
20 +
21 override var identifier: String {
21 - return "LoadMoreCell"
22 + "LoadMoreCell"
23 }
23 -
24 +
25 override var rowHeight: CGFloat {
25 - return 44
26 + 56
27 }
27 -
28 +
29 override var estimatedRowHeight: CGFloat {
29 - return 44
30 + 56
31 }
31 -
32 +
33 override func populateView(cell: JomloTableViewCell) {
33 - let cell = cell as! LoadMoreCell
34 - cell.activityIndicator.startAnimating()
34 + (cell as? LoadMoreCell)?.activityIndicator.startAnimating()
35 + guard !hasRequestedNextPage else { return }
36 +
37 + hasRequestedNextPage = true
38 onLoadMore()
39 }
37 -
40 +
41 }
Example/JomloTableView/Rows/SimpleCell.swift
+45 -14
@@ -14,34 +14,65 @@ class SimpleCell: JomloTableViewCell {
14 @IBOutlet var titleLabel: UILabel!
15 @IBOutlet var subTitleLabel: UILabel!
16
17 + override func awakeFromNib() {
18 + super.awakeFromNib()
19 +
20 + backgroundColor = .secondarySystemGroupedBackground
21 + contentView.backgroundColor = .secondarySystemGroupedBackground
22 +
23 + titleLabel.font = .preferredFont(forTextStyle: .headline)
24 + titleLabel.textColor = .label
25 + titleLabel.adjustsFontForContentSizeCategory = true
26 +
27 + subTitleLabel.font = .preferredFont(forTextStyle: .subheadline)
28 + subTitleLabel.textColor = .secondaryLabel
29 + subTitleLabel.adjustsFontForContentSizeCategory = true
30 + subTitleLabel.numberOfLines = 0
31 + subTitleLabel.textAlignment = .natural
32 +
33 + selectedBackgroundView = {
34 + let view = UIView()
35 + view.backgroundColor = UIColor.systemIndigo.withAlphaComponent(0.12)
36 + return view
37 + }()
38 + }
39 +
40 }
41
42 class SimpleRow: JomloTableViewRow {
20 -
21 - var title: String!
22 - var subTitle: String!
23 -
24 - init(_ title: String, subTitle: String) {
43 +
44 + private let title: String
45 + private let subTitle: String
46 + private let accessoryType: UITableViewCell.AccessoryType
47 +
48 + init(
49 + _ title: String,
50 + subTitle: String,
51 + accessoryType: UITableViewCell.AccessoryType = .none
52 + ) {
53 self.title = title
54 self.subTitle = subTitle
55 + self.accessoryType = accessoryType
56 }
28 -
57 +
58 override var identifier: String {
30 - return "SimpleCell"
59 + "SimpleCell"
60 }
32 -
61 +
62 override var rowHeight: CGFloat {
34 - return UITableView.automaticDimension
63 + UITableView.automaticDimension
64 }
36 -
65 +
66 override var estimatedRowHeight: CGFloat {
38 - return 64
67 + 88
68 }
40 -
69 +
70 override func populateView(cell: JomloTableViewCell) {
42 - let cell = cell as! SimpleCell
71 + guard let cell = cell as? SimpleCell else { return }
72 +
73 cell.titleLabel.text = title
74 cell.subTitleLabel.text = subTitle
75 + cell.accessoryType = accessoryType
76 }
46 -
77 +
78 }
Example/JomloTableView/View Controllers/NotJomloSimpleTableViewController.swift
+55 -74
@@ -11,100 +11,81 @@ import UIKit
11 class NotJomloSimpleTableViewController: UIViewController {
12
13 @IBOutlet var tableView: UITableView!
14 -
15 - var tweets = [Tweet]()
16 -
14 +
15 + private let rows = SampleContent.rows
16 +
17 override func viewDidLoad() {
18 super.viewDidLoad()
19
20 + title = "UITableView"
21 + navigationItem.largeTitleDisplayMode = .always
22 + ExampleStyle.configure(tableView)
23 }
21 -
22 - internal func loadTweets() {
23 -
24 - let searchEndPoint = "https://api.twitter.com/1.1/search/tweets.json"
25 - let params = ["q" : "jomlo"]
26 - var clientError: NSError?
27 - }
28 -
29 - internal func populate(data: Data) {
30 - do {
31 - if let json = try JSONSerialization.jsonObject(with: data, options: []) as? [String: Any] {
32 - // print("json: \(json)")
33 - if let statuses = json["statuses"] as? [Any] {
34 - // print("statuses: \(statuses)")
35 - for status in statuses {
36 - print("status: \(status)")
37 - let status = status as! [String: Any]
38 - // print("\(status["text"])")
39 - let user = status["user"] as! [String: Any]
40 -
41 - let tweet = Tweet(screenName: user["screen_name"] as! String, name: user["name"] as! String, text: status["text"] as! String)
42 - // profile_image_url_https
43 - tweets.append(tweet)
44 -
45 - }
46 - DispatchQueue.main.async {
47 - self.tableView.isHidden = false
48 - self.tableView.reloadData()
49 - }
50 - }
51 - }
52 -
53 -
54 - } catch let jsonError as NSError {
55 - print("json error: \(jsonError.localizedDescription)")
56 - }
57 - }
58 -
24 }
25
61 -extension NotJomloSimpleTableViewController: UITableViewDelegate {
62 -
26 +extension NotJomloSimpleTableViewController: UITableViewDataSource {
27 +
28 func numberOfSections(in tableView: UITableView) -> Int {
64 - return 1
65 - }
66 -
67 - func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
68 - return 88
69 - }
70 -
71 - func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
72 - return 88
29 + 1
30 }
74 -}
31
76 -extension NotJomloSimpleTableViewController: UITableViewDataSource {
77 -
32 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
79 - return tweets.count
33 + rows.count
34 }
81 -
35 +
36 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
83 -
37 +
38 var cell = tableView.dequeueReusableCell(withIdentifier: "SimpleCell") as? SimpleCell
85 -
39 +
40 if cell == nil {
41 let nib = UINib(nibName: "SimpleCell", bundle: nil)
42 tableView.register(nib, forCellReuseIdentifier: "SimpleCell")
43 cell = tableView.dequeueReusableCell(withIdentifier: "SimpleCell") as? SimpleCell
44 }
91 -
92 - cell?.textLabel?.text = "@\(tweets[indexPath.row].screenName!) \(tweets[indexPath.row].name!)"
93 - cell?.subTitleLabel.text = tweets[indexPath.row].text!
94 -
95 - return cell!
45 +
46 + let row = rows[indexPath.row]
47 + cell?.titleLabel.text = row.title
48 + cell?.subTitleLabel.text = row.subtitle
49 + cell?.accessoryType = .none
50 +
51 + return cell ?? UITableViewCell(style: .subtitle, reuseIdentifier: "FallbackCell")
52 }
97 -
53 +
54 }
55
100 -class Tweet {
101 - var screenName: String!
102 - var name: String!
103 - var text: String!
104 -
105 - init(screenName: String, name: String, text: String) {
106 - self.screenName = screenName
107 - self.name = name
108 - self.text = text
56 +extension NotJomloSimpleTableViewController: UITableViewDelegate {
57 +
58 + func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
59 + UITableView.automaticDimension
60 }
61 +
62 + func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
63 + 88
64 + }
65 +}
66 +
67 +enum SampleContent {
68 + struct Row {
69 + let title: String
70 + let subtitle: String
71 + }
72 +
73 + static let rows = [
74 + Row(
75 + title: "Small controllers",
76 + subtitle: "The Jomlo example lets row objects handle cell data instead of putting that work in the view controller."
77 + ),
78 + Row(
79 + title: "Dynamic type",
80 + subtitle: "Cells use preferred text styles, so the layout follows the reader's text size settings."
81 + ),
82 + Row(
83 + title: "Automatic height",
84 + subtitle: "Longer descriptions can wrap naturally. The table asks each row for an estimated height and lets Auto Layout do the final measurement."
85 + ),
86 + Row(
87 + title: "Nib-backed cells",
88 + subtitle: "The library still works with Interface Builder cells, which keeps the old sample structure intact while the presentation feels current."
89 + ),
90 + ]
91 }
Example/JomloTableView/View Controllers/SimpleTableViewController.swift
+11 -38
@@ -12,48 +12,21 @@ import JomloTableView
12 class SimpleTableViewController: UIViewController {
13
14 @IBOutlet var jomloTableView: JomloTableView!
15 -
16 - let tableSection = JomloTableViewSection()
17 -
15 +
16 + private let tableSection = JomloTableViewSection()
17 +
18 override func viewDidLoad() {
19 super.viewDidLoad()
20 -
21 - jomloTableView.addSection(section: tableSection)
22 -
23 - }
20
25 - internal func loadTweets() {
26 -
27 - let searchEndPoint = "https://api.twitter.com/1.1/search/tweets.json"
28 - let params = ["q" : "jomlo"]
29 - var clientError: NSError?
30 - }
21 + title = "Jomlo"
22 + navigationItem.largeTitleDisplayMode = .always
23 + ExampleStyle.configure(jomloTableView)
24
32 - internal func populate(data: Data) {
33 - do {
34 - if let json = try JSONSerialization.jsonObject(with: data, options: []) as? [String: Any] {
35 -// print("json: \(json)")
36 - if let statuses = json["statuses"] as? [Any] {
37 -// print("statuses: \(statuses)")
38 - for status in statuses {
39 - print("status: \(status)")
40 - let status = status as! [String: Any]
41 -// print("\(status["text"])")
42 - let user = status["user"] as! [String: Any]
43 -
44 - let row = SimpleRow("@\(user["screen_name"] as! String) \(user["name"] as! String)", subTitle: status["text"] as! String)
45 - tableSection.addRow(row: row)
46 -
47 - }
48 - DispatchQueue.main.async {
49 - self.jomloTableView.reloadData()
50 - }
51 - }
52 - }
53 -
54 -
55 - } catch let jsonError as NSError {
56 - print("json error: \(jsonError.localizedDescription)")
25 + SampleContent.rows.forEach { item in
26 + tableSection.addRow(row: SimpleRow(item.title, subTitle: item.subtitle))
27 }
28 +
29 + jomloTableView.addSection(section: tableSection)
30 + jomloTableView.reloadData()
31 }
32 }
Example/JomloTableView/ViewController.swift
+47 -48
@@ -9,66 +9,65 @@
9 import UIKit
10 import JomloTableView
11
12 +enum ExampleStyle {
13 + static let tintColor = UIColor.systemIndigo
14 + static let backgroundColor = UIColor.systemGroupedBackground
15 +
16 + static func configureNavigationBar() {
17 + UINavigationBar.appearance().prefersLargeTitles = true
18 + UINavigationBar.appearance().tintColor = tintColor
19 + UITabBar.appearance().tintColor = tintColor
20 + }
21 +
22 + static func configure(_ tableView: UITableView) {
23 + tableView.backgroundColor = backgroundColor
24 + tableView.separatorStyle = .singleLine
25 + tableView.separatorInset = UIEdgeInsets(top: 0, left: 20, bottom: 0, right: 20)
26 + tableView.cellLayoutMarginsFollowReadableWidth = true
27 + tableView.contentInsetAdjustmentBehavior = .automatic
28 + tableView.rowHeight = UITableView.automaticDimension
29 + tableView.estimatedRowHeight = 88
30 + tableView.tableFooterView = UIView()
31 + }
32 +}
33 +
34 class ViewController: UIViewController {
13 -
35 +
36 @IBOutlet var jomloTableView: JomloTableView!
15 -
16 - var exampleSection = JomloTableViewSection()
37 +
38 + private let exampleSection = JomloTableViewSection()
39
40 override func viewDidLoad() {
41 super.viewDidLoad()
20 -
21 - let row0 = SimpleRow("Simple table view", subTitle: "A simple table view like we usually use. But this time, we use JomloTableView.")
22 - row0.setOnRowClicked { (row) in
42 +
43 + title = "JomloTableView"
44 + navigationController?.navigationBar.prefersLargeTitles = true
45 + navigationItem.largeTitleDisplayMode = .always
46 + ExampleStyle.configure(jomloTableView)
47 +
48 + let row0 = SimpleRow(
49 + "Rows and sections",
50 + subTitle: "Compare the JomloTableView version with the same screen written as a regular UITableView.",
51 + accessoryType: .disclosureIndicator
52 + )
53 + row0.setOnRowClicked { [weak self] _ in
54 + guard let self else { return }
55 self.performSegue(withIdentifier: "showSimpleTableViewExample", sender: self)
56 }
57 exampleSection.addRow(row: row0)
26 -
27 - let row1 = SimpleRow("Load more", subTitle: "A JomloTableView with load more row at the bottom. Will load infinite row if we scroll the table view to the bottom.")
28 - row1.setOnRowClicked { (row) in
58 +
59 + let row1 = SimpleRow(
60 + "Load more",
61 + subTitle: "Append another page when the loading row reaches the bottom of the table.",
62 + accessoryType: .disclosureIndicator
63 + )
64 + row1.setOnRowClicked { [weak self] _ in
65 + guard let self else { return }
66 self.performSegue(withIdentifier: "showLoadMoreExample", sender: self)
67 }
68 exampleSection.addRow(row: row1)
32 -
33 - let row2 = SimpleRow("Dynamic height", subTitle: "Example how to use dynamic height for single row. In fact, this example rows is also use dynamic height.")
34 - row2.setOnRowClicked { (row) in
35 - self.performSegue(withIdentifier: "showDynamicHeightExample", sender: self)
36 - }
37 - exampleSection.addRow(row: row2)
38 -
39 - let row3 = SimpleRow("WebView", subTitle: "A JomloTableView with WebView inside of its row.")
40 - row3.setOnRowClicked { (row) in
41 - self.performSegue(withIdentifier: "showWebViewExample", sender: self)
42 - }
43 - exampleSection.addRow(row: row3)
44 -
45 - let row4 = SimpleRow("Image list", subTitle: "A JomloTableView with image views inside of its row.")
46 - row4.setOnRowClicked { (row) in
47 - self.performSegue(withIdentifier: "showImageListExample", sender: self)
48 - }
49 - exampleSection.addRow(row: row4)
50 -
51 - let row5 = SimpleRow("Long layout", subTitle: "A JomloTableView which doesn't look like a table view.")
52 - row5.setOnRowClicked { (row) in
53 - self.performSegue(withIdentifier: "showLongLayoutExample", sender: self)
54 - }
55 - exampleSection.addRow(row: row5)
56 -
57 - let row6 = SimpleRow("StackView row", subTitle: "A JomloTableView with UIStackView inside of its rows. Here we use UITableViewAutomaticDimension for row's height property.")
58 - row6.setOnRowClicked { (row) in
59 - self.performSegue(withIdentifier: "showStackViewRowExample", sender: self)
60 - }
61 - exampleSection.addRow(row: row6)
62 -
69 +
70 jomloTableView.addSection(section: exampleSection)
71 jomloTableView.reloadData()
65 -
66 - }
67 -
68 - override func didReceiveMemoryWarning() {
69 - super.didReceiveMemoryWarning()
70 - // Dispose of any resources that can be recreated.
72 }
72 -
73 }
74 -
Example/Podfile
+3
@@ -5,8 +5,11 @@ def shared_pods
5 end
6
7 target 'JomloTableView_Example_iOS' do
8 + platform :ios, '14.0'
9 shared_pods
10 end
11 +
12 target 'JomloTableView_Example_tvOS' do
13 + platform :tvos, '14.0'
14 shared_pods
15 end
Example/Podfile.lock
+3 -3
@@ -9,8 +9,8 @@ EXTERNAL SOURCES:
9 :path: "../"
10
11 SPEC CHECKSUMS:
12 - JomloTableView: 1c0686881e4aaee4121956505a51b656db3bcb63
12 + JomloTableView: a55c5c79ce3c48904770fbfa7eaad3182a6bbad1
13
14 -PODFILE CHECKSUM: 547f75330e469611b9ae91e08c9c19ca4603788d
14 +PODFILE CHECKSUM: 4b19677d510096e7ff8bebd36e61f760f519446d
15
16 -COCOAPODS: 1.12.0
16 +COCOAPODS: 1.16.2
Example/Pods/Local Podspecs/JomloTableView.podspec.json
+2 -2
@@ -18,8 +18,8 @@
18 },
19 "social_media_url": "https://twitter.com/setoelkahfi",
20 "platforms": {
21 - "ios": "11.0",
22 - "tvos": "11.0"
21 + "ios": "14.0",
22 + "tvos": "14.0"
23 },
24 "source_files": "Sources/JomloTableView/**/*",
25 "swift_version": "5.7.3"
Example/Pods/Manifest.lock
+3 -3
@@ -9,8 +9,8 @@ EXTERNAL SOURCES:
9 :path: "../"
10
11 SPEC CHECKSUMS:
12 - JomloTableView: 1c0686881e4aaee4121956505a51b656db3bcb63
12 + JomloTableView: a55c5c79ce3c48904770fbfa7eaad3182a6bbad1
13
14 -PODFILE CHECKSUM: 547f75330e469611b9ae91e08c9c19ca4603788d
14 +PODFILE CHECKSUM: 4b19677d510096e7ff8bebd36e61f760f519446d
15
16 -COCOAPODS: 1.12.0
16 +COCOAPODS: 1.16.2
Example/Pods/Pods.xcodeproj/project.pbxproj
+274 -248
@@ -7,42 +7,42 @@
7 objects = {
8
9 /* Begin PBXBuildFile section */
10 - 0BF461F52C3D8FE618D118A1F3DE6F66 /* JomloTableViewRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = EFFB3043D700143713954B0FC3CD26F7 /* JomloTableViewRow.swift */; };
11 - 2315EA2F3880C380581054FC132F2232 /* JomloTableView-tvOS-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E58C54FE1FEF38F169024C6108B663E /* JomloTableView-tvOS-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
12 - 3501C19130C79AACFF1D4B1374ED7328 /* JomloTableView-iOS-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 9A67EF04DF344B9A15F8004ABEE92B7F /* JomloTableView-iOS-dummy.m */; };
13 - 3C8A625FB15C15C452188253027DBE13 /* JomloTableViewSection.swift in Sources */ = {isa = PBXBuildFile; fileRef = F0BBE1F7D3A2AB47667C9ECBD8C7A89E /* JomloTableViewSection.swift */; };
14 - 5AF1A4FC767A2722D25F6E772BBA37EA /* Pods-JomloTableView_Example_iOS-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 4D3F2D471A2F53FD2C9B71AA74269922 /* Pods-JomloTableView_Example_iOS-dummy.m */; };
15 - 7212A0C1D6E98A114D5C38C92BB858B6 /* Pods-JomloTableView_Example_tvOS-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 8E806E87068B7CFD41C5329E4D6D8145 /* Pods-JomloTableView_Example_tvOS-dummy.m */; };
16 - 764C049CB27A6051F3F52E3D31484696 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 54E1F74047CAE9009037AFF5FCE00AF8 /* Foundation.framework */; };
17 - 7E81EBD2FCC910F18A26736A7DE3AFAA /* JomloTableView-tvOS-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = C4E540F1A4789CA60A09200DF0BDE12E /* JomloTableView-tvOS-dummy.m */; };
18 - 86E85D326EDD0AD7CDB9A95DA12CA9ED /* JomloTableView-iOS-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 266C93DF892BE926811596BCF6E264B1 /* JomloTableView-iOS-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
19 - A7B47C63CEFAC86A27614F5C62CB3880 /* JomloTableViewRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = EFFB3043D700143713954B0FC3CD26F7 /* JomloTableViewRow.swift */; };
20 - A85F6209C05A81E444DAF22074BEF0E7 /* JomloTableViewSection.swift in Sources */ = {isa = PBXBuildFile; fileRef = F0BBE1F7D3A2AB47667C9ECBD8C7A89E /* JomloTableViewSection.swift */; };
21 - A9CF767D4A8AC1BBCE161362D958AFDB /* Pods-JomloTableView_Example_iOS-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 8371EAD86E3E5C55CC947CFF93C9B060 /* Pods-JomloTableView_Example_iOS-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
22 - ACEC737C78F98C45BB917D1846ED4466 /* JomloTableView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14CA665AE0349F9E28270236A8E50EF5 /* JomloTableView.swift */; };
23 - BA910E71C4528AD88FB24A679946080D /* Pods-JomloTableView_Example_tvOS-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 6A0D980AC651B4459495267C80F1303D /* Pods-JomloTableView_Example_tvOS-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
24 - C76DE31FCCBD473DC2473B60D3B1C587 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 862ADB3E8E3DC6FD921084C65D936619 /* Foundation.framework */; };
25 - ECFBC262DB2BFA52D2CACC2BD9C51C90 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 54E1F74047CAE9009037AFF5FCE00AF8 /* Foundation.framework */; };
26 - F7382C4F6F3437402AE57BE29A3BD8F0 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 862ADB3E8E3DC6FD921084C65D936619 /* Foundation.framework */; };
27 - F8AA06EFF9932125CD200BCB8597CF74 /* JomloTableView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14CA665AE0349F9E28270236A8E50EF5 /* JomloTableView.swift */; };
28 - FA3AB8A459DCEBF272DB9C314247C5EB /* JomloTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB6416201CC25A483DEC5ACC8774046A /* JomloTableViewCell.swift */; };
29 - FD7351A2EBF565E67AC80C482676A3A3 /* JomloTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB6416201CC25A483DEC5ACC8774046A /* JomloTableViewCell.swift */; };
10 + 1E2F81172CA4913B150655CC45ACD2C9 /* JomloTableView-tvOS-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E58C54FE1FEF38F169024C6108B663E /* JomloTableView-tvOS-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
11 + 298F934AF1CA17513DE9E366A100EA62 /* Pods-JomloTableView_Example_tvOS-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 8E806E87068B7CFD41C5329E4D6D8145 /* Pods-JomloTableView_Example_tvOS-dummy.m */; };
12 + 3912D8B755515DE775E37923BF9ED758 /* JomloTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB6416201CC25A483DEC5ACC8774046A /* JomloTableViewCell.swift */; };
13 + 4A8A943784D32783B41ADA314973FA86 /* JomloTableView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14CA665AE0349F9E28270236A8E50EF5 /* JomloTableView.swift */; };
14 + 4AD083B08899D8931CBEC88DD6D6F904 /* JomloTableViewSection.swift in Sources */ = {isa = PBXBuildFile; fileRef = F0BBE1F7D3A2AB47667C9ECBD8C7A89E /* JomloTableViewSection.swift */; };
15 + 4B82DF8A5E9359E7CB01A58C592367DA /* Pods-JomloTableView_Example_iOS-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 4D3F2D471A2F53FD2C9B71AA74269922 /* Pods-JomloTableView_Example_iOS-dummy.m */; };
16 + 59A05124A7AA33D7C9A9E8C691F9078F /* Pods-JomloTableView_Example_tvOS-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 6A0D980AC651B4459495267C80F1303D /* Pods-JomloTableView_Example_tvOS-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
17 + 5B0B01AE99DB8F7A81C1844FB9200B11 /* JomloTableViewRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = EFFB3043D700143713954B0FC3CD26F7 /* JomloTableViewRow.swift */; };
18 + 624BC70DE3105769B3B1E11302ED6535 /* JomloTableView-iOS-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 266C93DF892BE926811596BCF6E264B1 /* JomloTableView-iOS-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
19 + 73F6A7DD14EDA89E0640A9AAAF149EA6 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FD1B2493FD5A3477922BA9EDEF115371 /* Foundation.framework */; };
20 + 750DC5976D92DAB57BA3A1B40D54FFA3 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 886B70550F3C22CC20F9B77783E267E6 /* Foundation.framework */; };
21 + 787EA470ABA785A3966241F9D737B30C /* JomloTableViewSection.swift in Sources */ = {isa = PBXBuildFile; fileRef = F0BBE1F7D3A2AB47667C9ECBD8C7A89E /* JomloTableViewSection.swift */; };
22 + 79E3B3870AB94E47E9B92C9F2497490A /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FD1B2493FD5A3477922BA9EDEF115371 /* Foundation.framework */; };
23 + B0948F2230F39BCDD8D9E79F5C707967 /* JomloTableViewRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = EFFB3043D700143713954B0FC3CD26F7 /* JomloTableViewRow.swift */; };
24 + C7E2873840B73778B6FAECA4B7F690CC /* JomloTableView-iOS-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 9A67EF04DF344B9A15F8004ABEE92B7F /* JomloTableView-iOS-dummy.m */; };
25 + CBD7813FBF9CC2190C08E075A0ED82A8 /* JomloTableView-tvOS-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = C4E540F1A4789CA60A09200DF0BDE12E /* JomloTableView-tvOS-dummy.m */; };
26 + D758D50068027C3C80B5DD595499815D /* JomloTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB6416201CC25A483DEC5ACC8774046A /* JomloTableViewCell.swift */; };
27 + DB9091BB525194958F23D1EE7FE3B0D0 /* Pods-JomloTableView_Example_iOS-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 8371EAD86E3E5C55CC947CFF93C9B060 /* Pods-JomloTableView_Example_iOS-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
28 + FAB5539C3CB5731BD9339631F18ADA68 /* JomloTableView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14CA665AE0349F9E28270236A8E50EF5 /* JomloTableView.swift */; };
29 + FB354B0DE8724F27DFF734D88580E858 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 886B70550F3C22CC20F9B77783E267E6 /* Foundation.framework */; };
30 /* End PBXBuildFile section */
31
32 /* Begin PBXContainerItemProxy section */
33 - 02A2EA5F130DA1367852E4B4D7E2BC97 /* PBXContainerItemProxy */ = {
33 + 1C74CCA395521148231928EDB78B2F27 /* PBXContainerItemProxy */ = {
34 isa = PBXContainerItemProxy;
35 containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
36 proxyType = 1;
37 - remoteGlobalIDString = F11EFFD8C686C445C2CA9B0E84F708D2;
38 - remoteInfo = "JomloTableView-iOS";
37 + remoteGlobalIDString = FD9CD051D43B7D828D457DFF64B32AC0;
38 + remoteInfo = "JomloTableView-tvOS";
39 };
40 - CDFD6B2EFA3CD6DF0B783AAED9F446D4 /* PBXContainerItemProxy */ = {
40 + FF92F17719F5F17A74F2B6C72778CE2E /* PBXContainerItemProxy */ = {
41 isa = PBXContainerItemProxy;
42 containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
43 proxyType = 1;
44 - remoteGlobalIDString = FD9CD051D43B7D828D457DFF64B32AC0;
45 - remoteInfo = "JomloTableView-tvOS";
44 + remoteGlobalIDString = F11EFFD8C686C445C2CA9B0E84F708D2;
45 + remoteInfo = "JomloTableView-iOS";
46 };
47 /* End PBXContainerItemProxy section */
48
@@ -57,7 +57,6 @@
57 463C7EE16E7E0748DE34FA4CD4A2711E /* JomloTableView-tvOS.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; name = "JomloTableView-tvOS.modulemap"; path = "../JomloTableView-tvOS/JomloTableView-tvOS.modulemap"; sourceTree = "<group>"; };
58 4D3F2D471A2F53FD2C9B71AA74269922 /* Pods-JomloTableView_Example_iOS-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-JomloTableView_Example_iOS-dummy.m"; sourceTree = "<group>"; };
59 4D7D748AED60DC07397260F78FC4DAC0 /* Pods-JomloTableView_Example_tvOS.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-JomloTableView_Example_tvOS.modulemap"; sourceTree = "<group>"; };
60 - 54E1F74047CAE9009037AFF5FCE00AF8 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; };
60 5A0A908FBB675390AD911904D8783C9C /* JomloTableView-iOS-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "JomloTableView-iOS-prefix.pch"; sourceTree = "<group>"; };
61 64CFBFEB63B97E379A8CF5357657F16D /* JomloTableView-tvOS.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "JomloTableView-tvOS.release.xcconfig"; path = "../JomloTableView-tvOS/JomloTableView-tvOS.release.xcconfig"; sourceTree = "<group>"; };
62 6A0D980AC651B4459495267C80F1303D /* Pods-JomloTableView_Example_tvOS-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-JomloTableView_Example_tvOS-umbrella.h"; sourceTree = "<group>"; };
@@ -68,7 +67,7 @@
67 835515ECE3A33ED4DF24120D648559F0 /* Pods-JomloTableView_Example_tvOS.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-JomloTableView_Example_tvOS.debug.xcconfig"; sourceTree = "<group>"; };
68 8371EAD86E3E5C55CC947CFF93C9B060 /* Pods-JomloTableView_Example_iOS-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-JomloTableView_Example_iOS-umbrella.h"; sourceTree = "<group>"; };
69 84037A93B01DB99E1C41A5AF1E6581F7 /* Pods-JomloTableView_Example_iOS-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-JomloTableView_Example_iOS-frameworks.sh"; sourceTree = "<group>"; };
71 - 862ADB3E8E3DC6FD921084C65D936619 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS14.0.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; };
70 + 886B70550F3C22CC20F9B77783E267E6 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS18.0.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; };
71 8E806E87068B7CFD41C5329E4D6D8145 /* Pods-JomloTableView_Example_tvOS-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-JomloTableView_Example_tvOS-dummy.m"; sourceTree = "<group>"; };
72 97968B316F158E203D38B82C7C92CECD /* Pods-JomloTableView_Example_tvOS */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = "Pods-JomloTableView_Example_tvOS"; path = Pods_JomloTableView_Example_tvOS.framework; sourceTree = BUILT_PRODUCTS_DIR; };
73 97E1017699436AD586FF63E4D8AC092A /* Pods-JomloTableView_Example_iOS-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-JomloTableView_Example_iOS-acknowledgements.markdown"; sourceTree = "<group>"; };
@@ -93,38 +92,39 @@
92 EFFB3043D700143713954B0FC3CD26F7 /* JomloTableViewRow.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = JomloTableViewRow.swift; path = Sources/JomloTableView/JomloTableViewRow.swift; sourceTree = "<group>"; };
93 F0BBE1F7D3A2AB47667C9ECBD8C7A89E /* JomloTableViewSection.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = JomloTableViewSection.swift; path = Sources/JomloTableView/JomloTableViewSection.swift; sourceTree = "<group>"; };
94 F2B80DE8F893786F15C4F020EAF39E44 /* JomloTableView-tvOS */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = "JomloTableView-tvOS"; path = JomloTableView.framework; sourceTree = BUILT_PRODUCTS_DIR; };
95 + FD1B2493FD5A3477922BA9EDEF115371 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS18.0.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; };
96 /* End PBXFileReference section */
97
98 /* Begin PBXFrameworksBuildPhase section */
99 - 1215A172772AB8C803A426F74E033908 /* Frameworks */ = {
99 + 74CE3BE151D69847B09795AFEED8F10E /* Frameworks */ = {
100 isa = PBXFrameworksBuildPhase;
101 buildActionMask = 2147483647;
102 files = (
103 - C76DE31FCCBD473DC2473B60D3B1C587 /* Foundation.framework in Frameworks */,
103 + FB354B0DE8724F27DFF734D88580E858 /* Foundation.framework in Frameworks */,
104 );
105 runOnlyForDeploymentPostprocessing = 0;
106 };
107 - 2BFE131D8E0E539DABFD05B61E5C1561 /* Frameworks */ = {
107 + AD1E1563B887F4E76D89651EB9CB5D0C /* Frameworks */ = {
108 isa = PBXFrameworksBuildPhase;
109 buildActionMask = 2147483647;
110 files = (
111 - F7382C4F6F3437402AE57BE29A3BD8F0 /* Foundation.framework in Frameworks */,
111 + 79E3B3870AB94E47E9B92C9F2497490A /* Foundation.framework in Frameworks */,
112 );
113 runOnlyForDeploymentPostprocessing = 0;
114 };
115 - 8859274A4B056642815CD1BDD98163DB /* Frameworks */ = {
115 + C77893A393930C768F2C704010D2FDB8 /* Frameworks */ = {
116 isa = PBXFrameworksBuildPhase;
117 buildActionMask = 2147483647;
118 files = (
119 - ECFBC262DB2BFA52D2CACC2BD9C51C90 /* Foundation.framework in Frameworks */,
119 + 73F6A7DD14EDA89E0640A9AAAF149EA6 /* Foundation.framework in Frameworks */,
120 );
121 runOnlyForDeploymentPostprocessing = 0;
122 };
123 - D23FF8C862152137F179F3E20F200EE4 /* Frameworks */ = {
123 + F47F4ECDAD4A2CED0FB555FF4384FC41 /* Frameworks */ = {
124 isa = PBXFrameworksBuildPhase;
125 buildActionMask = 2147483647;
126 files = (
127 - 764C049CB27A6051F3F52E3D31484696 /* Foundation.framework in Frameworks */,
127 + 750DC5976D92DAB57BA3A1B40D54FFA3 /* Foundation.framework in Frameworks */,
128 );
129 runOnlyForDeploymentPostprocessing = 0;
130 };
@@ -192,10 +192,10 @@
192 path = "Target Support Files/Pods-JomloTableView_Example_iOS";
193 sourceTree = "<group>";
194 };
195 - 7BA426A61ECDB18091804837513E216F /* tvOS */ = {
195 + 5D199CA79328798A9CC193A612BC5CAC /* tvOS */ = {
196 isa = PBXGroup;
197 children = (
198 - 862ADB3E8E3DC6FD921084C65D936619 /* Foundation.framework */,
198 + 886B70550F3C22CC20F9B77783E267E6 /* Foundation.framework */,
199 );
200 name = tvOS;
201 sourceTree = "<group>";
@@ -203,8 +203,8 @@
203 8910DE18F4068EE7F2F8E36E5101A369 /* Frameworks */ = {
204 isa = PBXGroup;
205 children = (
206 - C0A19B97BA9DB17ACAB60CC4FA3D6A30 /* iOS */,
207 - 7BA426A61ECDB18091804837513E216F /* tvOS */,
206 + F3C0D8EB072AFFB00F91A3ED1B7CCA53 /* iOS */,
207 + 5D199CA79328798A9CC193A612BC5CAC /* tvOS */,
208 );
209 name = Frameworks;
210 sourceTree = "<group>";
@@ -217,14 +217,6 @@
217 name = "Development Pods";
218 sourceTree = "<group>";
219 };
220 - C0A19B97BA9DB17ACAB60CC4FA3D6A30 /* iOS */ = {
221 - isa = PBXGroup;
222 - children = (
223 - 54E1F74047CAE9009037AFF5FCE00AF8 /* Foundation.framework */,
224 - );
225 - name = iOS;
226 - sourceTree = "<group>";
227 - };
220 CF1408CF629C7361332E53B88F7BD30C = {
221 isa = PBXGroup;
222 children = (
@@ -275,38 +267,46 @@
267 path = "Example/Pods/Target Support Files/JomloTableView-iOS";
268 sourceTree = "<group>";
269 };
270 + F3C0D8EB072AFFB00F91A3ED1B7CCA53 /* iOS */ = {
271 + isa = PBXGroup;
272 + children = (
273 + FD1B2493FD5A3477922BA9EDEF115371 /* Foundation.framework */,
274 + );
275 + name = iOS;
276 + sourceTree = "<group>";
277 + };
278 /* End PBXGroup section */
279
280 /* Begin PBXHeadersBuildPhase section */
281 - 3F8091D5F82FBCDE2BC924CFE1CA51F2 /* Headers */ = {
281 + 2AF52AEB484771A848F4F6B050969681 /* Headers */ = {
282 isa = PBXHeadersBuildPhase;
283 buildActionMask = 2147483647;
284 files = (
285 - 2315EA2F3880C380581054FC132F2232 /* JomloTableView-tvOS-umbrella.h in Headers */,
285 + DB9091BB525194958F23D1EE7FE3B0D0 /* Pods-JomloTableView_Example_iOS-umbrella.h in Headers */,
286 );
287 runOnlyForDeploymentPostprocessing = 0;
288 };
289 - 621228D0F6B41D7D214484D8BB71B41A /* Headers */ = {
289 + 61739FC8A48F736DCE324F6086BEC286 /* Headers */ = {
290 isa = PBXHeadersBuildPhase;
291 buildActionMask = 2147483647;
292 files = (
293 - BA910E71C4528AD88FB24A679946080D /* Pods-JomloTableView_Example_tvOS-umbrella.h in Headers */,
293 + 59A05124A7AA33D7C9A9E8C691F9078F /* Pods-JomloTableView_Example_tvOS-umbrella.h in Headers */,
294 );
295 runOnlyForDeploymentPostprocessing = 0;
296 };
297 - AD0A4C302A26C410713D3F1EA1114536 /* Headers */ = {
297 + 87A82BAEA9D765B9BF51096199DBE572 /* Headers */ = {
298 isa = PBXHeadersBuildPhase;
299 buildActionMask = 2147483647;
300 files = (
301 - 86E85D326EDD0AD7CDB9A95DA12CA9ED /* JomloTableView-iOS-umbrella.h in Headers */,
301 + 1E2F81172CA4913B150655CC45ACD2C9 /* JomloTableView-tvOS-umbrella.h in Headers */,
302 );
303 runOnlyForDeploymentPostprocessing = 0;
304 };
305 - FDEBA2CB076B57DEFBEE4B312E3F6BA6 /* Headers */ = {
305 + E3A444F93ADD09D49F160F17E09FEEA6 /* Headers */ = {
306 isa = PBXHeadersBuildPhase;
307 buildActionMask = 2147483647;
308 files = (
309 - A9CF767D4A8AC1BBCE161362D958AFDB /* Pods-JomloTableView_Example_iOS-umbrella.h in Headers */,
309 + 624BC70DE3105769B3B1E11302ED6535 /* JomloTableView-iOS-umbrella.h in Headers */,
310 );
311 runOnlyForDeploymentPostprocessing = 0;
312 };
@@ -315,17 +315,17 @@
315 /* Begin PBXNativeTarget section */
316 4410BEFA85A5839BA3B8986DDCBC83AE /* Pods-JomloTableView_Example_iOS */ = {
317 isa = PBXNativeTarget;
318 - buildConfigurationList = 4967BBC0C73BDCA18A95D3822FD9F6FD /* Build configuration list for PBXNativeTarget "Pods-JomloTableView_Example_iOS" */;
318 + buildConfigurationList = 2155389B15FA06DBEA2059A786F2D550 /* Build configuration list for PBXNativeTarget "Pods-JomloTableView_Example_iOS" */;
319 buildPhases = (
320 - FDEBA2CB076B57DEFBEE4B312E3F6BA6 /* Headers */,
321 - 89F1742A9F8DB356A67FCA54B10F167E /* Sources */,
322 - 8859274A4B056642815CD1BDD98163DB /* Frameworks */,
323 - AE3353830B2F1ABF61111325D27BC673 /* Resources */,
320 + 2AF52AEB484771A848F4F6B050969681 /* Headers */,
321 + 40DDCC88DD1047E475BC55F47865F34C /* Sources */,
322 + AD1E1563B887F4E76D89651EB9CB5D0C /* Frameworks */,
323 + BD44A5A44EC0BC34E5A534BFEE78A695 /* Resources */,
324 );
325 buildRules = (
326 );
327 dependencies = (
328 - A40A89E6780467DE26E033017092737F /* PBXTargetDependency */,
328 + 4283763C013D66777C025DE2730A505F /* PBXTargetDependency */,
329 );
330 name = "Pods-JomloTableView_Example_iOS";
331 productName = Pods_JomloTableView_Example_iOS;
@@ -334,17 +334,17 @@
334 };
335 EE4509AF1FF2CBB24B1C45F3E5A50DEB /* Pods-JomloTableView_Example_tvOS */ = {
336 isa = PBXNativeTarget;
337 - buildConfigurationList = 51784DB4F838B666BB4B7E7D90BE1DB1 /* Build configuration list for PBXNativeTarget "Pods-JomloTableView_Example_tvOS" */;
337 + buildConfigurationList = 2895DAAECD918CA10C1FF8B9B6CC1B18 /* Build configuration list for PBXNativeTarget "Pods-JomloTableView_Example_tvOS" */;
338 buildPhases = (
339 - 621228D0F6B41D7D214484D8BB71B41A /* Headers */,
340 - 6F3BD4A04C193BCBAEA5C7B69783B129 /* Sources */,
341 - 2BFE131D8E0E539DABFD05B61E5C1561 /* Frameworks */,
342 - 16ADAED80D5C21AB162FB9AA42703475 /* Resources */,
339 + 61739FC8A48F736DCE324F6086BEC286 /* Headers */,
340 + 32DFD267C7FBD03B9BC8886E22B1D984 /* Sources */,
341 + 74CE3BE151D69847B09795AFEED8F10E /* Frameworks */,
342 + 98A84D43F3120D4508612C4B4306EBB6 /* Resources */,
343 );
344 buildRules = (
345 );
346 dependencies = (
347 - B83EA76D2A44104FF992F08F7F0A6921 /* PBXTargetDependency */,
347 + A84A6E458D3C7FDB8D99F1EB85A48D84 /* PBXTargetDependency */,
348 );
349 name = "Pods-JomloTableView_Example_tvOS";
350 productName = Pods_JomloTableView_Example_tvOS;
@@ -353,12 +353,12 @@
353 };
354 F11EFFD8C686C445C2CA9B0E84F708D2 /* JomloTableView-iOS */ = {
355 isa = PBXNativeTarget;
356 - buildConfigurationList = 38814FC06AE240C04FC1F5D2E738FF24 /* Build configuration list for PBXNativeTarget "JomloTableView-iOS" */;
356 + buildConfigurationList = DCB336352706ED12B2AE833263F34C66 /* Build configuration list for PBXNativeTarget "JomloTableView-iOS" */;
357 buildPhases = (
358 - AD0A4C302A26C410713D3F1EA1114536 /* Headers */,
359 - 14CECF915046E8B5277089D8E0917CEE /* Sources */,
360 - D23FF8C862152137F179F3E20F200EE4 /* Frameworks */,
361 - 59A6C2DCEC16A0DFE57561EB2C37534B /* Resources */,
358 + E3A444F93ADD09D49F160F17E09FEEA6 /* Headers */,
359 + 1808FA834AFA167D54733B4F04E691FA /* Sources */,
360 + C77893A393930C768F2C704010D2FDB8 /* Frameworks */,
361 + CC086E7A931E373E7F45E6226575E5EF /* Resources */,
362 );
363 buildRules = (
364 );
@@ -371,12 +371,12 @@
371 };
372 FD9CD051D43B7D828D457DFF64B32AC0 /* JomloTableView-tvOS */ = {
373 isa = PBXNativeTarget;
374 - buildConfigurationList = 94036CB1E78530D3EA95322924C00680 /* Build configuration list for PBXNativeTarget "JomloTableView-tvOS" */;
374 + buildConfigurationList = ED662AB20364795A49394227AF25B7A9 /* Build configuration list for PBXNativeTarget "JomloTableView-tvOS" */;
375 buildPhases = (
376 - 3F8091D5F82FBCDE2BC924CFE1CA51F2 /* Headers */,
377 - DEB9A7F14994E1C02B7260E1243D80C0 /* Sources */,
378 - 1215A172772AB8C803A426F74E033908 /* Frameworks */,
379 - E47F0FF3FC4045A3C29B1B56E4816883 /* Resources */,
376 + 87A82BAEA9D765B9BF51096199DBE572 /* Headers */,
377 + 2C162F62E2753A17ABAB173814CF6FD6 /* Sources */,
378 + F47F4ECDAD4A2CED0FB555FF4384FC41 /* Frameworks */,
379 + 30DC8586D81E73B644674AFC37E133F8 /* Resources */,
380 );
381 buildRules = (
382 );
@@ -393,8 +393,8 @@
393 BFDFE7DC352907FC980B868725387E98 /* Project object */ = {
394 isa = PBXProject;
395 attributes = {
396 - LastSwiftUpdateCheck = 1300;
397 - LastUpgradeCheck = 1300;
396 + LastSwiftUpdateCheck = 1600;
397 + LastUpgradeCheck = 1600;
398 };
399 buildConfigurationList = 4821239608C13582E20E6DA73FD5F1F9 /* Build configuration list for PBXProject "Pods" */;
400 compatibilityVersion = "Xcode 3.2";
@@ -405,6 +405,8 @@
405 en,
406 );
407 mainGroup = CF1408CF629C7361332E53B88F7BD30C;
408 + minimizedProjectReferenceProxies = 0;
409 + preferredProjectObjectVersion = 77;
410 productRefGroup = 302E89969B0BF2FDAA0B65043C1228D3 /* Products */;
411 projectDirPath = "";
412 projectRoot = "";
@@ -418,28 +420,28 @@
420 /* End PBXProject section */
421
422 /* Begin PBXResourcesBuildPhase section */
421 - 16ADAED80D5C21AB162FB9AA42703475 /* Resources */ = {
423 + 30DC8586D81E73B644674AFC37E133F8 /* Resources */ = {
424 isa = PBXResourcesBuildPhase;
425 buildActionMask = 2147483647;
426 files = (
427 );
428 runOnlyForDeploymentPostprocessing = 0;
429 };
428 - 59A6C2DCEC16A0DFE57561EB2C37534B /* Resources */ = {
430 + 98A84D43F3120D4508612C4B4306EBB6 /* Resources */ = {
431 isa = PBXResourcesBuildPhase;
432 buildActionMask = 2147483647;
433 files = (
434 );
435 runOnlyForDeploymentPostprocessing = 0;
436 };
435 - AE3353830B2F1ABF61111325D27BC673 /* Resources */ = {
437 + BD44A5A44EC0BC34E5A534BFEE78A695 /* Resources */ = {
438 isa = PBXResourcesBuildPhase;
439 buildActionMask = 2147483647;
440 files = (
441 );
442 runOnlyForDeploymentPostprocessing = 0;
443 };
442 - E47F0FF3FC4045A3C29B1B56E4816883 /* Resources */ = {
444 + CC086E7A931E373E7F45E6226575E5EF /* Resources */ = {
445 isa = PBXResourcesBuildPhase;
446 buildActionMask = 2147483647;
447 files = (
@@ -449,65 +451,65 @@
451 /* End PBXResourcesBuildPhase section */
452
453 /* Begin PBXSourcesBuildPhase section */
452 - 14CECF915046E8B5277089D8E0917CEE /* Sources */ = {
454 + 1808FA834AFA167D54733B4F04E691FA /* Sources */ = {
455 isa = PBXSourcesBuildPhase;
456 buildActionMask = 2147483647;
457 files = (
456 - ACEC737C78F98C45BB917D1846ED4466 /* JomloTableView.swift in Sources */,
457 - 3501C19130C79AACFF1D4B1374ED7328 /* JomloTableView-iOS-dummy.m in Sources */,
458 - FA3AB8A459DCEBF272DB9C314247C5EB /* JomloTableViewCell.swift in Sources */,
459 - A7B47C63CEFAC86A27614F5C62CB3880 /* JomloTableViewRow.swift in Sources */,
460 - A85F6209C05A81E444DAF22074BEF0E7 /* JomloTableViewSection.swift in Sources */,
458 + 4A8A943784D32783B41ADA314973FA86 /* JomloTableView.swift in Sources */,
459 + C7E2873840B73778B6FAECA4B7F690CC /* JomloTableView-iOS-dummy.m in Sources */,
460 + 3912D8B755515DE775E37923BF9ED758 /* JomloTableViewCell.swift in Sources */,
461 + B0948F2230F39BCDD8D9E79F5C707967 /* JomloTableViewRow.swift in Sources */,
462 + 4AD083B08899D8931CBEC88DD6D6F904 /* JomloTableViewSection.swift in Sources */,
463 );
464 runOnlyForDeploymentPostprocessing = 0;
465 };
464 - 6F3BD4A04C193BCBAEA5C7B69783B129 /* Sources */ = {
466 + 2C162F62E2753A17ABAB173814CF6FD6 /* Sources */ = {
467 isa = PBXSourcesBuildPhase;
468 buildActionMask = 2147483647;
469 files = (
468 - 7212A0C1D6E98A114D5C38C92BB858B6 /* Pods-JomloTableView_Example_tvOS-dummy.m in Sources */,
470 + FAB5539C3CB5731BD9339631F18ADA68 /* JomloTableView.swift in Sources */,
471 + CBD7813FBF9CC2190C08E075A0ED82A8 /* JomloTableView-tvOS-dummy.m in Sources */,
472 + D758D50068027C3C80B5DD595499815D /* JomloTableViewCell.swift in Sources */,
473 + 5B0B01AE99DB8F7A81C1844FB9200B11 /* JomloTableViewRow.swift in Sources */,
474 + 787EA470ABA785A3966241F9D737B30C /* JomloTableViewSection.swift in Sources */,
475 );
476 runOnlyForDeploymentPostprocessing = 0;
477 };
472 - 89F1742A9F8DB356A67FCA54B10F167E /* Sources */ = {
478 + 32DFD267C7FBD03B9BC8886E22B1D984 /* Sources */ = {
479 isa = PBXSourcesBuildPhase;
480 buildActionMask = 2147483647;
481 files = (
476 - 5AF1A4FC767A2722D25F6E772BBA37EA /* Pods-JomloTableView_Example_iOS-dummy.m in Sources */,
482 + 298F934AF1CA17513DE9E366A100EA62 /* Pods-JomloTableView_Example_tvOS-dummy.m in Sources */,
483 );
484 runOnlyForDeploymentPostprocessing = 0;
485 };
480 - DEB9A7F14994E1C02B7260E1243D80C0 /* Sources */ = {
486 + 40DDCC88DD1047E475BC55F47865F34C /* Sources */ = {
487 isa = PBXSourcesBuildPhase;
488 buildActionMask = 2147483647;
489 files = (
484 - F8AA06EFF9932125CD200BCB8597CF74 /* JomloTableView.swift in Sources */,
485 - 7E81EBD2FCC910F18A26736A7DE3AFAA /* JomloTableView-tvOS-dummy.m in Sources */,
486 - FD7351A2EBF565E67AC80C482676A3A3 /* JomloTableViewCell.swift in Sources */,
487 - 0BF461F52C3D8FE618D118A1F3DE6F66 /* JomloTableViewRow.swift in Sources */,
488 - 3C8A625FB15C15C452188253027DBE13 /* JomloTableViewSection.swift in Sources */,
490 + 4B82DF8A5E9359E7CB01A58C592367DA /* Pods-JomloTableView_Example_iOS-dummy.m in Sources */,
491 );
492 runOnlyForDeploymentPostprocessing = 0;
493 };
494 /* End PBXSourcesBuildPhase section */
495
496 /* Begin PBXTargetDependency section */
495 - A40A89E6780467DE26E033017092737F /* PBXTargetDependency */ = {
497 + 4283763C013D66777C025DE2730A505F /* PBXTargetDependency */ = {
498 isa = PBXTargetDependency;
499 name = "JomloTableView-iOS";
500 target = F11EFFD8C686C445C2CA9B0E84F708D2 /* JomloTableView-iOS */;
499 - targetProxy = 02A2EA5F130DA1367852E4B4D7E2BC97 /* PBXContainerItemProxy */;
501 + targetProxy = FF92F17719F5F17A74F2B6C72778CE2E /* PBXContainerItemProxy */;
502 };
501 - B83EA76D2A44104FF992F08F7F0A6921 /* PBXTargetDependency */ = {
503 + A84A6E458D3C7FDB8D99F1EB85A48D84 /* PBXTargetDependency */ = {
504 isa = PBXTargetDependency;
505 name = "JomloTableView-tvOS";
506 target = FD9CD051D43B7D828D457DFF64B32AC0 /* JomloTableView-tvOS */;
505 - targetProxy = CDFD6B2EFA3CD6DF0B783AAED9F446D4 /* PBXContainerItemProxy */;
507 + targetProxy = 1C74CCA395521148231928EDB78B2F27 /* PBXContainerItemProxy */;
508 };
509 /* End PBXTargetDependency section */
510
511 /* Begin XCBuildConfiguration section */
510 - 0FE9E00A04DA03007AFDED75E6E5D96F /* Debug */ = {
512 + 2ECC29AB55D4E53B673F608322CB7186 /* Debug */ = {
513 isa = XCBuildConfiguration;
514 baseConfigurationReference = 835515ECE3A33ED4DF24120D648559F0 /* Pods-JomloTableView_Example_tvOS.debug.xcconfig */;
515 buildSettings = {
@@ -520,6 +522,8 @@
522 DYLIB_COMPATIBILITY_VERSION = 1;
523 DYLIB_CURRENT_VERSION = 1;
524 DYLIB_INSTALL_NAME_BASE = "@rpath";
525 + ENABLE_MODULE_VERIFIER = NO;
526 + ENABLE_USER_SCRIPT_SANDBOXING = NO;
527 INFOPLIST_FILE = "Target Support Files/Pods-JomloTableView_Example_tvOS/Pods-JomloTableView_Example_tvOS-Info.plist";
528 INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
529 LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
@@ -533,15 +537,15 @@
537 SDKROOT = appletvos;
538 SKIP_INSTALL = YES;
539 TARGETED_DEVICE_FAMILY = 3;
536 - TVOS_DEPLOYMENT_TARGET = 16.1;
540 + TVOS_DEPLOYMENT_TARGET = 14.0;
541 VERSIONING_SYSTEM = "apple-generic";
542 VERSION_INFO_PREFIX = "";
543 };
544 name = Debug;
545 };
542 - 32907CF76A7557DCA907059CF193F5DC /* Debug */ = {
546 + 3A40F9C0C231A87B57444FF4819BD465 /* Release */ = {
547 isa = XCBuildConfiguration;
544 - baseConfigurationReference = 1F081E30E99026E063F8EF080B1EA004 /* Pods-JomloTableView_Example_iOS.debug.xcconfig */;
548 + baseConfigurationReference = A9DCB7FCD5E8E442F291FE31F0910625 /* Pods-JomloTableView_Example_iOS.release.xcconfig */;
549 buildSettings = {
550 ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO;
551 ARCHS = "$(ARCHS_STANDARD_64_BIT)";
@@ -554,9 +558,11 @@
558 DYLIB_COMPATIBILITY_VERSION = 1;
559 DYLIB_CURRENT_VERSION = 1;
560 DYLIB_INSTALL_NAME_BASE = "@rpath";
561 + ENABLE_MODULE_VERIFIER = NO;
562 + ENABLE_USER_SCRIPT_SANDBOXING = NO;
563 INFOPLIST_FILE = "Target Support Files/Pods-JomloTableView_Example_iOS/Pods-JomloTableView_Example_iOS-Info.plist";
564 INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
559 - IPHONEOS_DEPLOYMENT_TARGET = 11.0;
565 + IPHONEOS_DEPLOYMENT_TARGET = 14.0;
566 LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
567 MACH_O_TYPE = staticlib;
568 MODULEMAP_FILE = "Target Support Files/Pods-JomloTableView_Example_iOS/Pods-JomloTableView_Example_iOS.modulemap";
@@ -568,17 +574,17 @@
574 SDKROOT = iphoneos;
575 SKIP_INSTALL = YES;
576 TARGETED_DEVICE_FAMILY = "1,2";
577 + VALIDATE_PRODUCT = YES;
578 VERSIONING_SYSTEM = "apple-generic";
579 VERSION_INFO_PREFIX = "";
580 };
574 - name = Debug;
581 + name = Release;
582 };
576 - 365746BE9A9066B63A51E6D102A54291 /* Debug */ = {
583 + 47C5C82FC0D6BF95F31FAC2CEE2FE7DF /* Release */ = {
584 isa = XCBuildConfiguration;
578 - baseConfigurationReference = 9E0648D4FF2DE4200E413474B8FD5376 /* JomloTableView-iOS.debug.xcconfig */;
585 + baseConfigurationReference = 80383E50572115E4E929D8181136954E /* Pods-JomloTableView_Example_tvOS.release.xcconfig */;
586 buildSettings = {
580 - ARCHS = "$(ARCHS_STANDARD_64_BIT)";
581 - CLANG_ENABLE_OBJC_WEAK = NO;
587 + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO;
588 "CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
589 "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
590 "CODE_SIGN_IDENTITY[sdk=watchos*]" = "";
@@ -587,92 +593,29 @@
593 DYLIB_COMPATIBILITY_VERSION = 1;
594 DYLIB_CURRENT_VERSION = 1;
595 DYLIB_INSTALL_NAME_BASE = "@rpath";
590 - GCC_PREFIX_HEADER = "Target Support Files/JomloTableView-iOS/JomloTableView-iOS-prefix.pch";
591 - INFOPLIST_FILE = "Target Support Files/JomloTableView-iOS/JomloTableView-iOS-Info.plist";
596 + ENABLE_MODULE_VERIFIER = NO;
597 + ENABLE_USER_SCRIPT_SANDBOXING = NO;
598 + INFOPLIST_FILE = "Target Support Files/Pods-JomloTableView_Example_tvOS/Pods-JomloTableView_Example_tvOS-Info.plist";
599 INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
593 - IPHONEOS_DEPLOYMENT_TARGET = 11.0;
600 LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
595 - MODULEMAP_FILE = "Target Support Files/JomloTableView-iOS/JomloTableView-iOS.modulemap";
596 - PRODUCT_MODULE_NAME = JomloTableView;
597 - PRODUCT_NAME = JomloTableView;
598 - SDKROOT = iphoneos;
601 + MACH_O_TYPE = staticlib;
602 + MODULEMAP_FILE = "Target Support Files/Pods-JomloTableView_Example_tvOS/Pods-JomloTableView_Example_tvOS.modulemap";
603 + OTHER_LDFLAGS = "";
604 + OTHER_LIBTOOLFLAGS = "";
605 + PODS_ROOT = "$(SRCROOT)";
606 + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}";
607 + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
608 + SDKROOT = appletvos;
609 SKIP_INSTALL = YES;
600 - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) ";
601 - SWIFT_VERSION = 5.7.3;
602 - TARGETED_DEVICE_FAMILY = "1,2";
610 + TARGETED_DEVICE_FAMILY = 3;
611 + TVOS_DEPLOYMENT_TARGET = 14.0;
612 + VALIDATE_PRODUCT = YES;
613 VERSIONING_SYSTEM = "apple-generic";
614 VERSION_INFO_PREFIX = "";
615 };
606 - name = Debug;
607 - };
608 - 44BBDBF1782695099FE0FD8DBD240A55 /* Debug */ = {
609 - isa = XCBuildConfiguration;
610 - buildSettings = {
611 - ALWAYS_SEARCH_USER_PATHS = NO;
612 - CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
613 - CLANG_ANALYZER_NONNULL = YES;
614 - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
615 - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
616 - CLANG_CXX_LIBRARY = "libc++";
617 - CLANG_ENABLE_MODULES = YES;
618 - CLANG_ENABLE_OBJC_ARC = YES;
619 - CLANG_ENABLE_OBJC_WEAK = YES;
620 - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
621 - CLANG_WARN_BOOL_CONVERSION = YES;
622 - CLANG_WARN_COMMA = YES;
623 - CLANG_WARN_CONSTANT_CONVERSION = YES;
624 - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
625 - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
626 - CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
627 - CLANG_WARN_EMPTY_BODY = YES;
628 - CLANG_WARN_ENUM_CONVERSION = YES;
629 - CLANG_WARN_INFINITE_RECURSION = YES;
630 - CLANG_WARN_INT_CONVERSION = YES;
631 - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
632 - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
633 - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
634 - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
635 - CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
636 - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
637 - CLANG_WARN_STRICT_PROTOTYPES = YES;
638 - CLANG_WARN_SUSPICIOUS_MOVE = YES;
639 - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
640 - CLANG_WARN_UNREACHABLE_CODE = YES;
641 - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
642 - COPY_PHASE_STRIP = NO;
643 - DEBUG_INFORMATION_FORMAT = dwarf;
644 - ENABLE_STRICT_OBJC_MSGSEND = YES;
645 - ENABLE_TESTABILITY = YES;
646 - GCC_C_LANGUAGE_STANDARD = gnu11;
647 - GCC_DYNAMIC_NO_PIC = NO;
648 - GCC_NO_COMMON_BLOCKS = YES;
649 - GCC_OPTIMIZATION_LEVEL = 0;
650 - GCC_PREPROCESSOR_DEFINITIONS = (
651 - "POD_CONFIGURATION_DEBUG=1",
652 - "DEBUG=1",
653 - "$(inherited)",
654 - );
655 - GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
656 - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
657 - GCC_WARN_UNDECLARED_SELECTOR = YES;
658 - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
659 - GCC_WARN_UNUSED_FUNCTION = YES;
660 - GCC_WARN_UNUSED_VARIABLE = YES;
661 - IPHONEOS_DEPLOYMENT_TARGET = 11.0;
662 - MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
663 - MTL_FAST_MATH = YES;
664 - ONLY_ACTIVE_ARCH = YES;
665 - PRODUCT_NAME = "$(TARGET_NAME)";
666 - STRIP_INSTALLED_PRODUCT = NO;
667 - SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
668 - SWIFT_OPTIMIZATION_LEVEL = "-Onone";
669 - SWIFT_VERSION = 5.0;
670 - SYMROOT = "${SRCROOT}/../build";
671 - TVOS_DEPLOYMENT_TARGET = 16.1;
672 - };
673 - name = Debug;
616 + name = Release;
617 };
675 - 5236F33C7A17725CB8D6FEBDFF7F94D2 /* Release */ = {
618 + 4B387C53F4AAC1D750F4A24904F9A974 /* Release */ = {
619 isa = XCBuildConfiguration;
620 baseConfigurationReference = 71F2E5CE11D5CF72CCBE8EC5B3267A4B /* JomloTableView-iOS.release.xcconfig */;
621 buildSettings = {
@@ -686,10 +629,13 @@
629 DYLIB_COMPATIBILITY_VERSION = 1;
630 DYLIB_CURRENT_VERSION = 1;
631 DYLIB_INSTALL_NAME_BASE = "@rpath";
632 + ENABLE_MODULE_VERIFIER = NO;
633 + ENABLE_USER_SCRIPT_SANDBOXING = NO;
634 GCC_PREFIX_HEADER = "Target Support Files/JomloTableView-iOS/JomloTableView-iOS-prefix.pch";
635 + GENERATE_INFOPLIST_FILE = NO;
636 INFOPLIST_FILE = "Target Support Files/JomloTableView-iOS/JomloTableView-iOS-Info.plist";
637 INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
692 - IPHONEOS_DEPLOYMENT_TARGET = 11.0;
638 + IPHONEOS_DEPLOYMENT_TARGET = 14.0;
639 LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
640 MODULEMAP_FILE = "Target Support Files/JomloTableView-iOS/JomloTableView-iOS.modulemap";
641 PRODUCT_MODULE_NAME = JomloTableView;
@@ -697,6 +643,7 @@
643 SDKROOT = iphoneos;
644 SKIP_INSTALL = YES;
645 SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) ";
646 + SWIFT_INSTALL_OBJC_HEADER = YES;
647 SWIFT_VERSION = 5.7.3;
648 TARGETED_DEVICE_FAMILY = "1,2";
649 VALIDATE_PRODUCT = YES;
@@ -705,9 +652,9 @@
652 };
653 name = Release;
654 };
708 - 739715D53C57B4C3184BF36B75055799 /* Release */ = {
655 + 4BE4C75E1830C62D874E7E04090DD60E /* Debug */ = {
656 isa = XCBuildConfiguration;
710 - baseConfigurationReference = 64CFBFEB63B97E379A8CF5357657F16D /* JomloTableView-tvOS.release.xcconfig */;
657 + baseConfigurationReference = CFFE7CC693687D2D4877FEB5D5DBC192 /* JomloTableView-tvOS.debug.xcconfig */;
658 buildSettings = {
659 "CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
660 "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
@@ -717,7 +664,10 @@
664 DYLIB_COMPATIBILITY_VERSION = 1;
665 DYLIB_CURRENT_VERSION = 1;
666 DYLIB_INSTALL_NAME_BASE = "@rpath";
667 + ENABLE_MODULE_VERIFIER = NO;
668 + ENABLE_USER_SCRIPT_SANDBOXING = NO;
669 GCC_PREFIX_HEADER = "Target Support Files/JomloTableView-tvOS/JomloTableView-tvOS-prefix.pch";
670 + GENERATE_INFOPLIST_FILE = NO;
671 INFOPLIST_FILE = "Target Support Files/JomloTableView-tvOS/JomloTableView-tvOS-Info.plist";
672 INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
673 LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
@@ -727,20 +677,21 @@
677 SDKROOT = appletvos;
678 SKIP_INSTALL = YES;
679 SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) ";
680 + SWIFT_INSTALL_OBJC_HEADER = YES;
681 SWIFT_VERSION = 5.7.3;
682 TARGETED_DEVICE_FAMILY = 3;
732 - TVOS_DEPLOYMENT_TARGET = 11.0;
733 - VALIDATE_PRODUCT = YES;
683 + TVOS_DEPLOYMENT_TARGET = 14.0;
684 VERSIONING_SYSTEM = "apple-generic";
685 VERSION_INFO_PREFIX = "";
686 };
737 - name = Release;
687 + name = Debug;
688 };
739 - BD28F600258A2E0F1FD53BFCF1AF7F80 /* Release */ = {
689 + 6D09C50630B427B7B662D809099D22DE /* Debug */ = {
690 isa = XCBuildConfiguration;
741 - baseConfigurationReference = 80383E50572115E4E929D8181136954E /* Pods-JomloTableView_Example_tvOS.release.xcconfig */;
691 + baseConfigurationReference = 9E0648D4FF2DE4200E413474B8FD5376 /* JomloTableView-iOS.debug.xcconfig */;
692 buildSettings = {
743 - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO;
693 + ARCHS = "$(ARCHS_STANDARD_64_BIT)";
694 + CLANG_ENABLE_OBJC_WEAK = NO;
695 "CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
696 "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
697 "CODE_SIGN_IDENTITY[sdk=watchos*]" = "";
@@ -749,29 +700,94 @@
700 DYLIB_COMPATIBILITY_VERSION = 1;
701 DYLIB_CURRENT_VERSION = 1;
702 DYLIB_INSTALL_NAME_BASE = "@rpath";
752 - INFOPLIST_FILE = "Target Support Files/Pods-JomloTableView_Example_tvOS/Pods-JomloTableView_Example_tvOS-Info.plist";
703 + ENABLE_MODULE_VERIFIER = NO;
704 + ENABLE_USER_SCRIPT_SANDBOXING = NO;
705 + GCC_PREFIX_HEADER = "Target Support Files/JomloTableView-iOS/JomloTableView-iOS-prefix.pch";
706 + GENERATE_INFOPLIST_FILE = NO;
707 + INFOPLIST_FILE = "Target Support Files/JomloTableView-iOS/JomloTableView-iOS-Info.plist";
708 INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
709 + IPHONEOS_DEPLOYMENT_TARGET = 14.0;
710 LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
755 - MACH_O_TYPE = staticlib;
756 - MODULEMAP_FILE = "Target Support Files/Pods-JomloTableView_Example_tvOS/Pods-JomloTableView_Example_tvOS.modulemap";
757 - OTHER_LDFLAGS = "";
758 - OTHER_LIBTOOLFLAGS = "";
759 - PODS_ROOT = "$(SRCROOT)";
760 - PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}";
761 - PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
762 - SDKROOT = appletvos;
711 + MODULEMAP_FILE = "Target Support Files/JomloTableView-iOS/JomloTableView-iOS.modulemap";
712 + PRODUCT_MODULE_NAME = JomloTableView;
713 + PRODUCT_NAME = JomloTableView;
714 + SDKROOT = iphoneos;
715 SKIP_INSTALL = YES;
764 - TARGETED_DEVICE_FAMILY = 3;
765 - TVOS_DEPLOYMENT_TARGET = 16.1;
766 - VALIDATE_PRODUCT = YES;
716 + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) ";
717 + SWIFT_INSTALL_OBJC_HEADER = YES;
718 + SWIFT_VERSION = 5.7.3;
719 + TARGETED_DEVICE_FAMILY = "1,2";
720 VERSIONING_SYSTEM = "apple-generic";
721 VERSION_INFO_PREFIX = "";
722 };
723 + name = Debug;
724 + };
725 + C16AF5D58E2E660029801252E6E77F68 /* Release */ = {
726 + isa = XCBuildConfiguration;
727 + buildSettings = {
728 + ALWAYS_SEARCH_USER_PATHS = NO;
729 + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
730 + CLANG_ANALYZER_NONNULL = YES;
731 + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
732 + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
733 + CLANG_CXX_LIBRARY = "libc++";
734 + CLANG_ENABLE_MODULES = YES;
735 + CLANG_ENABLE_OBJC_ARC = YES;
736 + CLANG_ENABLE_OBJC_WEAK = YES;
737 + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
738 + CLANG_WARN_BOOL_CONVERSION = YES;
739 + CLANG_WARN_COMMA = YES;
740 + CLANG_WARN_CONSTANT_CONVERSION = YES;
741 + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
742 + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
743 + CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
744 + CLANG_WARN_EMPTY_BODY = YES;
745 + CLANG_WARN_ENUM_CONVERSION = YES;
746 + CLANG_WARN_INFINITE_RECURSION = YES;
747 + CLANG_WARN_INT_CONVERSION = YES;
748 + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
749 + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
750 + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
751 + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
752 + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
753 + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
754 + CLANG_WARN_STRICT_PROTOTYPES = YES;
755 + CLANG_WARN_SUSPICIOUS_MOVE = YES;
756 + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
757 + CLANG_WARN_UNREACHABLE_CODE = YES;
758 + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
759 + COPY_PHASE_STRIP = NO;
760 + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
761 + ENABLE_NS_ASSERTIONS = NO;
762 + ENABLE_STRICT_OBJC_MSGSEND = YES;
763 + GCC_C_LANGUAGE_STANDARD = gnu11;
764 + GCC_NO_COMMON_BLOCKS = YES;
765 + GCC_PREPROCESSOR_DEFINITIONS = (
766 + "POD_CONFIGURATION_RELEASE=1",
767 + "$(inherited)",
768 + );
769 + GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
770 + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
771 + GCC_WARN_UNDECLARED_SELECTOR = YES;
772 + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
773 + GCC_WARN_UNUSED_FUNCTION = YES;
774 + GCC_WARN_UNUSED_VARIABLE = YES;
775 + IPHONEOS_DEPLOYMENT_TARGET = 14.0;
776 + MTL_ENABLE_DEBUG_INFO = NO;
777 + MTL_FAST_MATH = YES;
778 + PRODUCT_NAME = "$(TARGET_NAME)";
779 + STRIP_INSTALLED_PRODUCT = NO;
780 + SWIFT_COMPILATION_MODE = wholemodule;
781 + SWIFT_OPTIMIZATION_LEVEL = "-O";
782 + SWIFT_VERSION = 5.0;
783 + SYMROOT = "${SRCROOT}/../build";
784 + TVOS_DEPLOYMENT_TARGET = 14.0;
785 + };
786 name = Release;
787 };
772 - D167B04012D037C742B240699706AEFB /* Release */ = {
788 + D5A2F7F60089B54E85985716D7D37C77 /* Debug */ = {
789 isa = XCBuildConfiguration;
774 - baseConfigurationReference = A9DCB7FCD5E8E442F291FE31F0910625 /* Pods-JomloTableView_Example_iOS.release.xcconfig */;
790 + baseConfigurationReference = 1F081E30E99026E063F8EF080B1EA004 /* Pods-JomloTableView_Example_iOS.debug.xcconfig */;
791 buildSettings = {
792 ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO;
793 ARCHS = "$(ARCHS_STANDARD_64_BIT)";
@@ -784,9 +800,11 @@
800 DYLIB_COMPATIBILITY_VERSION = 1;
801 DYLIB_CURRENT_VERSION = 1;
802 DYLIB_INSTALL_NAME_BASE = "@rpath";
803 + ENABLE_MODULE_VERIFIER = NO;
804 + ENABLE_USER_SCRIPT_SANDBOXING = NO;
805 INFOPLIST_FILE = "Target Support Files/Pods-JomloTableView_Example_iOS/Pods-JomloTableView_Example_iOS-Info.plist";
806 INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
789 - IPHONEOS_DEPLOYMENT_TARGET = 11.0;
807 + IPHONEOS_DEPLOYMENT_TARGET = 14.0;
808 LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
809 MACH_O_TYPE = staticlib;
810 MODULEMAP_FILE = "Target Support Files/Pods-JomloTableView_Example_iOS/Pods-JomloTableView_Example_iOS.modulemap";
@@ -798,15 +816,14 @@
816 SDKROOT = iphoneos;
817 SKIP_INSTALL = YES;
818 TARGETED_DEVICE_FAMILY = "1,2";
801 - VALIDATE_PRODUCT = YES;
819 VERSIONING_SYSTEM = "apple-generic";
820 VERSION_INFO_PREFIX = "";
821 };
805 - name = Release;
822 + name = Debug;
823 };
807 - D5438CAEBC00A818552826DB2A00AD88 /* Debug */ = {
824 + D70A3AA09E99748D61D6F76763D48F84 /* Release */ = {
825 isa = XCBuildConfiguration;
809 - baseConfigurationReference = CFFE7CC693687D2D4877FEB5D5DBC192 /* JomloTableView-tvOS.debug.xcconfig */;
826 + baseConfigurationReference = 64CFBFEB63B97E379A8CF5357657F16D /* JomloTableView-tvOS.release.xcconfig */;
827 buildSettings = {
828 "CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
829 "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
@@ -816,7 +833,10 @@
833 DYLIB_COMPATIBILITY_VERSION = 1;
834 DYLIB_CURRENT_VERSION = 1;
835 DYLIB_INSTALL_NAME_BASE = "@rpath";
836 + ENABLE_MODULE_VERIFIER = NO;
837 + ENABLE_USER_SCRIPT_SANDBOXING = NO;
838 GCC_PREFIX_HEADER = "Target Support Files/JomloTableView-tvOS/JomloTableView-tvOS-prefix.pch";
839 + GENERATE_INFOPLIST_FILE = NO;
840 INFOPLIST_FILE = "Target Support Files/JomloTableView-tvOS/JomloTableView-tvOS-Info.plist";
841 INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
842 LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
@@ -826,15 +846,17 @@
846 SDKROOT = appletvos;
847 SKIP_INSTALL = YES;
848 SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) ";
849 + SWIFT_INSTALL_OBJC_HEADER = YES;
850 SWIFT_VERSION = 5.7.3;
851 TARGETED_DEVICE_FAMILY = 3;
831 - TVOS_DEPLOYMENT_TARGET = 11.0;
852 + TVOS_DEPLOYMENT_TARGET = 14.0;
853 + VALIDATE_PRODUCT = YES;
854 VERSIONING_SYSTEM = "apple-generic";
855 VERSION_INFO_PREFIX = "";
856 };
835 - name = Debug;
857 + name = Release;
858 };
837 - EA42127E6CDB783F0A1B049BA6C2EE3F /* Release */ = {
859 + F8C88A0B03E64133E971ECE9E74D99EA /* Debug */ = {
860 isa = XCBuildConfiguration;
861 buildSettings = {
862 ALWAYS_SEARCH_USER_PATHS = NO;
@@ -869,13 +891,16 @@
891 CLANG_WARN_UNREACHABLE_CODE = YES;
892 CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
893 COPY_PHASE_STRIP = NO;
872 - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
873 - ENABLE_NS_ASSERTIONS = NO;
894 + DEBUG_INFORMATION_FORMAT = dwarf;
895 ENABLE_STRICT_OBJC_MSGSEND = YES;
896 + ENABLE_TESTABILITY = YES;
897 GCC_C_LANGUAGE_STANDARD = gnu11;
898 + GCC_DYNAMIC_NO_PIC = NO;
899 GCC_NO_COMMON_BLOCKS = YES;
900 + GCC_OPTIMIZATION_LEVEL = 0;
901 GCC_PREPROCESSOR_DEFINITIONS = (
878 - "POD_CONFIGURATION_RELEASE=1",
902 + "POD_CONFIGURATION_DEBUG=1",
903 + "DEBUG=1",
904 "$(inherited)",
905 );
906 GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
@@ -884,63 +909,64 @@
909 GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
910 GCC_WARN_UNUSED_FUNCTION = YES;
911 GCC_WARN_UNUSED_VARIABLE = YES;
887 - IPHONEOS_DEPLOYMENT_TARGET = 11.0;
888 - MTL_ENABLE_DEBUG_INFO = NO;
912 + IPHONEOS_DEPLOYMENT_TARGET = 14.0;
913 + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
914 MTL_FAST_MATH = YES;
915 + ONLY_ACTIVE_ARCH = YES;
916 PRODUCT_NAME = "$(TARGET_NAME)";
917 STRIP_INSTALLED_PRODUCT = NO;
892 - SWIFT_COMPILATION_MODE = wholemodule;
893 - SWIFT_OPTIMIZATION_LEVEL = "-O";
918 + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
919 + SWIFT_OPTIMIZATION_LEVEL = "-Onone";
920 SWIFT_VERSION = 5.0;
921 SYMROOT = "${SRCROOT}/../build";
896 - TVOS_DEPLOYMENT_TARGET = 16.1;
922 + TVOS_DEPLOYMENT_TARGET = 14.0;
923 };
898 - name = Release;
924 + name = Debug;
925 };
926 /* End XCBuildConfiguration section */
927
928 /* Begin XCConfigurationList section */
903 - 38814FC06AE240C04FC1F5D2E738FF24 /* Build configuration list for PBXNativeTarget "JomloTableView-iOS" */ = {
929 + 2155389B15FA06DBEA2059A786F2D550 /* Build configuration list for PBXNativeTarget "Pods-JomloTableView_Example_iOS" */ = {
930 isa = XCConfigurationList;
931 buildConfigurations = (
906 - 365746BE9A9066B63A51E6D102A54291 /* Debug */,
907 - 5236F33C7A17725CB8D6FEBDFF7F94D2 /* Release */,
932 + D5A2F7F60089B54E85985716D7D37C77 /* Debug */,
933 + 3A40F9C0C231A87B57444FF4819BD465 /* Release */,
934 );
935 defaultConfigurationIsVisible = 0;
936 defaultConfigurationName = Release;
937 };
912 - 4821239608C13582E20E6DA73FD5F1F9 /* Build configuration list for PBXProject "Pods" */ = {
938 + 2895DAAECD918CA10C1FF8B9B6CC1B18 /* Build configuration list for PBXNativeTarget "Pods-JomloTableView_Example_tvOS" */ = {
939 isa = XCConfigurationList;
940 buildConfigurations = (
915 - 44BBDBF1782695099FE0FD8DBD240A55 /* Debug */,
916 - EA42127E6CDB783F0A1B049BA6C2EE3F /* Release */,
941 + 2ECC29AB55D4E53B673F608322CB7186 /* Debug */,
942 + 47C5C82FC0D6BF95F31FAC2CEE2FE7DF /* Release */,
943 );
944 defaultConfigurationIsVisible = 0;
945 defaultConfigurationName = Release;
946 };
921 - 4967BBC0C73BDCA18A95D3822FD9F6FD /* Build configuration list for PBXNativeTarget "Pods-JomloTableView_Example_iOS" */ = {
947 + 4821239608C13582E20E6DA73FD5F1F9 /* Build configuration list for PBXProject "Pods" */ = {
948 isa = XCConfigurationList;
949 buildConfigurations = (
924 - 32907CF76A7557DCA907059CF193F5DC /* Debug */,
925 - D167B04012D037C742B240699706AEFB /* Release */,
950 + F8C88A0B03E64133E971ECE9E74D99EA /* Debug */,
951 + C16AF5D58E2E660029801252E6E77F68 /* Release */,
952 );
953 defaultConfigurationIsVisible = 0;
954 defaultConfigurationName = Release;
955 };
930 - 51784DB4F838B666BB4B7E7D90BE1DB1 /* Build configuration list for PBXNativeTarget "Pods-JomloTableView_Example_tvOS" */ = {
956 + DCB336352706ED12B2AE833263F34C66 /* Build configuration list for PBXNativeTarget "JomloTableView-iOS" */ = {
957 isa = XCConfigurationList;
958 buildConfigurations = (
933 - 0FE9E00A04DA03007AFDED75E6E5D96F /* Debug */,
934 - BD28F600258A2E0F1FD53BFCF1AF7F80 /* Release */,
959 + 6D09C50630B427B7B662D809099D22DE /* Debug */,
960 + 4B387C53F4AAC1D750F4A24904F9A974 /* Release */,
961 );
962 defaultConfigurationIsVisible = 0;
963 defaultConfigurationName = Release;
964 };
939 - 94036CB1E78530D3EA95322924C00680 /* Build configuration list for PBXNativeTarget "JomloTableView-tvOS" */ = {
965 + ED662AB20364795A49394227AF25B7A9 /* Build configuration list for PBXNativeTarget "JomloTableView-tvOS" */ = {
966 isa = XCConfigurationList;
967 buildConfigurations = (
942 - D5438CAEBC00A818552826DB2A00AD88 /* Debug */,
943 - 739715D53C57B4C3184BF36B75055799 /* Release */,
968 + 4BE4C75E1830C62D874E7E04090DD60E /* Debug */,
969 + D70A3AA09E99748D61D6F76763D48F84 /* Release */,
970 );
971 defaultConfigurationIsVisible = 0;
972 defaultConfigurationName = Release;
Example/Pods/Target Support Files/JomloTableView-iOS/JomloTableView-iOS.debug.xcconfig
+1 -1
@@ -1,7 +1,7 @@
1 CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO
2 CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/JomloTableView-iOS
3 GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
4 -LIBRARY_SEARCH_PATHS = $(inherited) "${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift
4 +LIBRARY_SEARCH_PATHS = $(inherited) "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift
5 OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS
6 PODS_BUILD_DIR = ${BUILD_DIR}
7 PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
Example/Pods/Target Support Files/JomloTableView-iOS/JomloTableView-iOS.release.xcconfig
+1 -1
@@ -1,7 +1,7 @@
1 CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO
2 CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/JomloTableView-iOS
3 GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
4 -LIBRARY_SEARCH_PATHS = $(inherited) "${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift
4 +LIBRARY_SEARCH_PATHS = $(inherited) "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift
5 OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS
6 PODS_BUILD_DIR = ${BUILD_DIR}
7 PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
Example/Pods/Target Support Files/JomloTableView-tvOS/JomloTableView-tvOS.debug.xcconfig
+1 -1
@@ -1,7 +1,7 @@
1 CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO
2 CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/JomloTableView-tvOS
3 GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
4 -LIBRARY_SEARCH_PATHS = $(inherited) "${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift
4 +LIBRARY_SEARCH_PATHS = $(inherited) "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift
5 OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS
6 PODS_BUILD_DIR = ${BUILD_DIR}
7 PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
Example/Pods/Target Support Files/JomloTableView-tvOS/JomloTableView-tvOS.release.xcconfig
+1 -1
@@ -1,7 +1,7 @@
1 CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO
2 CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/JomloTableView-tvOS
3 GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
4 -LIBRARY_SEARCH_PATHS = $(inherited) "${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift
4 +LIBRARY_SEARCH_PATHS = $(inherited) "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift
5 OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS
6 PODS_BUILD_DIR = ${BUILD_DIR}
7 PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
Example/Pods/Target Support Files/Pods-JomloTableView_Example_iOS/Pods-JomloTableView_Example_iOS-frameworks.sh
+2 -2
@@ -18,7 +18,7 @@ echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}"
18 mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}"
19
20 COCOAPODS_PARALLEL_CODE_SIGN="${COCOAPODS_PARALLEL_CODE_SIGN:-false}"
21 -SWIFT_STDLIB_PATH="${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}"
21 +SWIFT_STDLIB_PATH="${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}"
22 BCSYMBOLMAP_DIR="BCSymbolMaps"
23
24
@@ -41,7 +41,7 @@ install_framework()
41
42 if [ -L "${source}" ]; then
43 echo "Symlinked..."
44 - source="$(readlink "${source}")"
44 + source="$(readlink -f "${source}")"
45 fi
46
47 if [ -d "${source}/${BCSYMBOLMAP_DIR}" ]; then
Example/Pods/Target Support Files/Pods-JomloTableView_Example_iOS/Pods-JomloTableView_Example_iOS.debug.xcconfig
+2 -1
@@ -4,8 +4,9 @@ FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/JomloTabl
4 GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
5 HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/JomloTableView-iOS/JomloTableView.framework/Headers"
6 LD_RUNPATH_SEARCH_PATHS = $(inherited) /usr/lib/swift '@executable_path/Frameworks' '@loader_path/Frameworks'
7 -LIBRARY_SEARCH_PATHS = $(inherited) "${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift
7 +LIBRARY_SEARCH_PATHS = $(inherited) "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift
8 OTHER_LDFLAGS = $(inherited) -framework "JomloTableView"
9 +OTHER_MODULE_VERIFIER_FLAGS = $(inherited) "-F${PODS_CONFIGURATION_BUILD_DIR}/JomloTableView-iOS"
10 OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS
11 PODS_BUILD_DIR = ${BUILD_DIR}
12 PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
Example/Pods/Target Support Files/Pods-JomloTableView_Example_iOS/Pods-JomloTableView_Example_iOS.release.xcconfig
+2 -1
@@ -4,8 +4,9 @@ FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/JomloTabl
4 GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
5 HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/JomloTableView-iOS/JomloTableView.framework/Headers"
6 LD_RUNPATH_SEARCH_PATHS = $(inherited) /usr/lib/swift '@executable_path/Frameworks' '@loader_path/Frameworks'
7 -LIBRARY_SEARCH_PATHS = $(inherited) "${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift
7 +LIBRARY_SEARCH_PATHS = $(inherited) "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift
8 OTHER_LDFLAGS = $(inherited) -framework "JomloTableView"
9 +OTHER_MODULE_VERIFIER_FLAGS = $(inherited) "-F${PODS_CONFIGURATION_BUILD_DIR}/JomloTableView-iOS"
10 OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS
11 PODS_BUILD_DIR = ${BUILD_DIR}
12 PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
Example/Pods/Target Support Files/Pods-JomloTableView_Example_tvOS/Pods-JomloTableView_Example_tvOS-frameworks.sh
+2 -2
@@ -18,7 +18,7 @@ echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}"
18 mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}"
19
20 COCOAPODS_PARALLEL_CODE_SIGN="${COCOAPODS_PARALLEL_CODE_SIGN:-false}"
21 -SWIFT_STDLIB_PATH="${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}"
21 +SWIFT_STDLIB_PATH="${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}"
22 BCSYMBOLMAP_DIR="BCSymbolMaps"
23
24
@@ -41,7 +41,7 @@ install_framework()
41
42 if [ -L "${source}" ]; then
43 echo "Symlinked..."
44 - source="$(readlink "${source}")"
44 + source="$(readlink -f "${source}")"
45 fi
46
47 if [ -d "${source}/${BCSYMBOLMAP_DIR}" ]; then
Example/Pods/Target Support Files/Pods-JomloTableView_Example_tvOS/Pods-JomloTableView_Example_tvOS.debug.xcconfig
+2 -1
@@ -4,8 +4,9 @@ FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/JomloTabl
4 GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
5 HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/JomloTableView-tvOS/JomloTableView.framework/Headers"
6 LD_RUNPATH_SEARCH_PATHS = $(inherited) /usr/lib/swift '@executable_path/Frameworks' '@loader_path/Frameworks'
7 -LIBRARY_SEARCH_PATHS = $(inherited) "${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift
7 +LIBRARY_SEARCH_PATHS = $(inherited) "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift
8 OTHER_LDFLAGS = $(inherited) -framework "JomloTableView"
9 +OTHER_MODULE_VERIFIER_FLAGS = $(inherited) "-F${PODS_CONFIGURATION_BUILD_DIR}/JomloTableView-tvOS"
10 OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS
11 PODS_BUILD_DIR = ${BUILD_DIR}
12 PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
Example/Pods/Target Support Files/Pods-JomloTableView_Example_tvOS/Pods-JomloTableView_Example_tvOS.release.xcconfig
+2 -1
@@ -4,8 +4,9 @@ FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/JomloTabl
4 GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
5 HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/JomloTableView-tvOS/JomloTableView.framework/Headers"
6 LD_RUNPATH_SEARCH_PATHS = $(inherited) /usr/lib/swift '@executable_path/Frameworks' '@loader_path/Frameworks'
7 -LIBRARY_SEARCH_PATHS = $(inherited) "${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift
7 +LIBRARY_SEARCH_PATHS = $(inherited) "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift
8 OTHER_LDFLAGS = $(inherited) -framework "JomloTableView"
9 +OTHER_MODULE_VERIFIER_FLAGS = $(inherited) "-F${PODS_CONFIGURATION_BUILD_DIR}/JomloTableView-tvOS"
10 OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS
11 PODS_BUILD_DIR = ${BUILD_DIR}
12 PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
JomloTableView.podspec
+2 -2
@@ -29,8 +29,8 @@ Pod::Spec.new do |s|
29 s.source = { git: 'https://github.com/setoelkahfi/JomloTableView.git', tag: s.version.to_s }
30 s.social_media_url = 'https://twitter.com/setoelkahfi'
31
32 - s.ios.deployment_target = '11.0'
33 - s.tvos.deployment_target = '11.0'
32 + s.ios.deployment_target = '14.0'
33 + s.tvos.deployment_target = '14.0'
34
35 s.source_files = 'Sources/JomloTableView/**/*'
36
Package.swift
+12 -8
@@ -1,25 +1,29 @@
1 -// swift-tools-version:5.7
1 +// swift-tools-version: 6.0
2
3 import PackageDescription
4
5 let package = Package(
6 name: "JomloTableView",
7 - platforms: [.iOS(.v11), .tvOS(.v11)],
7 + platforms: [.iOS(.v14), .tvOS(.v14)],
8 products: [
9 .library(
10 name: "JomloTableView",
11 - targets: ["JomloTableView"]),
11 + targets: ["JomloTableView"]
12 + )
13 ],
13 - dependencies: [],
14 targets: [
15 .target(
16 name: "JomloTableView",
17 - dependencies: []
17 + swiftSettings: [
18 + .swiftLanguageMode(.v6)
19 + ]
20 ),
21 .testTarget(
22 name: "JomloTableViewTests",
21 - dependencies: ["JomloTableView"]
23 + dependencies: ["JomloTableView"],
24 + swiftSettings: [
25 + .swiftLanguageMode(.v6)
26 + ]
27 ),
23 - ],
24 - swiftLanguageVersions: [.v5]
28 + ]
29 )
README.md
+25 -16
@@ -6,14 +6,14 @@
6 [![](https://img.shields.io/endpoint?url=https%3A%2F%2Fswiftpackageindex.com%2Fapi%2Fpackages%2Fsetoelkahfi%2FJomloTableView%2Fbadge%3Ftype%3Dswift-versions)](https://swiftpackageindex.com/setoelkahfi/JomloTableView)
7 [![](https://img.shields.io/endpoint?url=https%3A%2F%2Fswiftpackageindex.com%2Fapi%2Fpackages%2Fsetoelkahfi%2FJomloTableView%2Fbadge%3Ftype%3Dplatforms)](https://swiftpackageindex.com/setoelkahfi/JomloTableView)
8
9 -An iOS UITableView with detachable section and row. Use single section with multiple rows, or multiple sections with multiple rows.
10 -Conforming UITableViewDelegate and UITableViewDataSource in every view controller is a mundane and repetitive task. Move the delegate and the data source directly to the table view, and supply the table with section(s) and row(s). Free yourself from Massive-View-Controller.
9 +JomloTableView is a `UITableView` helper for building tables out of sections and rows. Use one section with many rows, or several sections with their own rows.
10
12 -Reference: https://goo.gl/zTGfpi, https://goo.gl/7vMbSF
11 +Writing `UITableViewDelegate` and `UITableViewDataSource` again and again gets old fast. JomloTableView moves that work into the table view itself, so your view controller can hand over sections and rows instead of carrying all the table plumbing.
12
13 ## Example
14
16 -To run the example project, clone the repo, and run `pod install` from the Example directory first.
15 +To run the example project, clone the repo and install the pods from the `Example` directory:
16 +
17 ```shell
18 git clone https://github.com/setoelkahfi/JomloTableView
19 cd Example
@@ -27,11 +27,11 @@ iOS 8
27
28 ## Installation
29
30 -JomloTableView is available through [CocoaPods](http://cocoapods.org) and Swift Package Manager.
30 +JomloTableView supports [CocoaPods](http://cocoapods.org) and Swift Package Manager.
31 +
32 +### CocoaPods
33
32 -### Cocoapods
33 -To install
34 -it, simply add the following line to your Podfile:
34 +Add this to your `Podfile`:
35
36 ```ruby
37 pod "JomloTableView"
@@ -39,13 +39,14 @@ pod "JomloTableView"
39
40 ### Swift Package Manager
41
42 -```swift
43 -
44 -```
42 +Add `https://github.com/setoelkahfi/JomloTableView` as a package dependency in Xcode.
43
44 ## Usage
47 -### Simple usage
48 -Use single section with multiple rows. All the rows below are from single class.
45 +
46 +### Simple table
47 +
48 +This example uses one section and several rows. Each row below uses the same row class.
49 +
50 ```swift
51 import UIKit
52 import JomloTableView
@@ -80,7 +81,9 @@ import JomloTableView
81
82 // Another code
83 ```
83 -The row
84 +
85 +The row class:
86 +
87 ```swift
88 import UIKit
89 import JomloTableView
@@ -125,7 +128,9 @@ class SimpleRow: JomloTableViewRow {
128 <img src="https://raw.githubusercontent.com/setoelkahfi/JomloTableView/release-0.2.0/images/example-rows-0.png" width="220" height="400" title="Example rows 2"/>&nbsp;&nbsp;&nbsp;<img src="https://raw.githubusercontent.com/setoelkahfi/JomloTableView/release-0.2.0/images/example-rows-1.png" width="220" height="400" title="Example rows 2"/>
129
130 ### Load more row
128 -This table view will load more row if loadMoreRow is populated. This example will load infinite rows if user scroll to bottom of table view. Eight rows per each load.
131 +
132 +Add a `loadMoreRow` when you want the table to append more data at the bottom. This example keeps adding rows when the user scrolls to the end, eight rows at a time.
133 +
134 ```swift
135 import UIKit
136 import JomloTableView
@@ -156,7 +161,7 @@ import JomloTableView
161 func addLoadMoreRow() {
162
163 let loadMoreRow = LoadMoreRow {
159 - // To get the effect or loading, delay the execution after 3 seconds
164 + // Simulate loading by delaying the next batch for 3 seconds.
165 DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 3, execute: {
166 self.tableSection.removeLastRow()
167 self.addRows()
@@ -179,3 +184,7 @@ Seto Elkahfi, setoelkahfi@gmail.com
184 ## License
185
186 JomloTableView is available under the MIT license. See the LICENSE file for more info.
187 +
188 +## Copyright
189 +
190 +2026 Onde Inference (Splitfire AB)
Sources/JomloTableView/JomloTableView.swift
+126 -88
@@ -1,102 +1,140 @@
1 //
2 // JomloTableView.swift
3 -// Pods
3 +// JomloTableView
4 //
5 // Created by Seto Elkahfi on 3/27/17.
6 //
7 -//
7
9 -import Foundation
8 #if canImport(UIKit)
11 -import UIKit
12 -
13 -/**
14 - This main class is basically a subclass from UITableView with sections array to hold row(s).
15 - This table view directly conform to UITableViewDelegate and UITableViewDataSource, makes your
16 - view controller that use table view free from conforming these two protocols.
17 -
18 - */
19 -@available(iOS 11.0, tvOS 11.0, *)
20 -public class JomloTableView: UITableView {
21 -
22 - // Table view section
23 - var sections = Array<JomloTableViewSection>()
24 -
25 - required public init?(coder aDecoder: NSCoder) {
26 - super.init(coder: aDecoder)
27 -
28 - delegate = self
29 - dataSource = self
30 - tableFooterView = UIView()
31 - }
32 -
33 - // Count all section in this table view
34 - public func numberOfSectionsInTableView(tableView: UITableView) -> Int {
35 - return sections.count
36 - }
37 -
38 - // Add single section to table view
39 - public func addSection(section: JomloTableViewSection) {
40 - sections.append(section)
41 - }
42 -
43 - // Remove all section in table view
44 - public func removeAllSection() {
45 - sections.removeAll()
46 - }
47 -
48 -}
49 -
50 -extension JomloTableView: UITableViewDelegate {
51 -
52 - // MARK: - UITableViewDelegate delegate extension
53 -
54 - public func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
55 - return sections[indexPath.section].rows[indexPath.row].estimatedRowHeight
56 - }
57 -
58 - public func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
59 - return sections[indexPath.section].rows[indexPath.row].rowHeight
60 - }
61 -
62 - public func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
63 - let item = sections[indexPath.section].rows[indexPath.row]
64 - item.onRowClicked()
65 - }
66 -
67 - public func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
68 - sections[indexPath.section].rows[indexPath.row].willDisplay(cell: cell)
9 + import UIKit
10 +
11 + /// A `UITableView` subclass that manages its own sections and rows.
12 + ///
13 + /// Instead of conforming to `UITableViewDelegate` and `UITableViewDataSource`
14 + /// in your view controller, supply this table view with `JomloTableViewSection`
15 + /// instances containing `JomloTableViewRow` objects.
16 + ///
17 + /// ## Usage
18 + /// ```swift
19 + /// let section = JomloTableViewSection()
20 + /// section.addRow(row: myRow)
21 + /// jomloTableView.addSection(section: section)
22 + /// jomloTableView.reloadData()
23 + /// ```
24 + @MainActor
25 + public class JomloTableView: UITableView {
26 +
27 + /// The sections displayed by this table view.
28 + var sections: [JomloTableViewSection] = []
29 +
30 + public required init?(coder aDecoder: NSCoder) {
31 + super.init(coder: aDecoder)
32 + delegate = self
33 + dataSource = self
34 + tableFooterView = UIView()
35 + }
36 +
37 + /// Creates a table view with the given frame and style.
38 + public override init(frame: CGRect, style: UITableView.Style) {
39 + super.init(frame: frame, style: style)
40 + delegate = self
41 + dataSource = self
42 + tableFooterView = UIView()
43 + }
44 +
45 + /// Returns the number of sections in this table view.
46 + public func numberOfSectionsInTableView(tableView: UITableView) -> Int {
47 + sections.count
48 + }
49 +
50 + /// Adds a section to this table view.
51 + ///
52 + /// - Parameter section: The section to append.
53 + public func addSection(section: JomloTableViewSection) {
54 + sections.append(section)
55 + }
56 +
57 + /// Removes all sections from this table view.
58 + public func removeAllSection() {
59 + sections.removeAll()
60 + }
61 }
70 -
71 -}
72 -
73 -extension JomloTableView: UITableViewDataSource {
74 -
75 - // MARK: - UITableViewDataSource delegate extension
76 -
77 - public func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
78 - if sections.count > 0 {
79 - return sections[section].count
80 - } else {
81 - return 0
62 +
63 + // MARK: - UITableViewDelegate
64 +
65 + extension JomloTableView: UITableViewDelegate {
66 +
67 + public func tableView(
68 + _ tableView: UITableView,
69 + estimatedHeightForRowAt indexPath: IndexPath
70 + ) -> CGFloat {
71 + sections[indexPath.section].rows[indexPath.row].estimatedRowHeight
72 + }
73 +
74 + public func tableView(
75 + _ tableView: UITableView,
76 + heightForRowAt indexPath: IndexPath
77 + ) -> CGFloat {
78 + sections[indexPath.section].rows[indexPath.row].rowHeight
79 + }
80 +
81 + public func tableView(
82 + _ tableView: UITableView,
83 + didSelectRowAt indexPath: IndexPath
84 + ) {
85 + let item = sections[indexPath.section].rows[indexPath.row]
86 + item.onRowClicked()
87 + }
88 +
89 + public func tableView(
90 + _ tableView: UITableView,
91 + willDisplay cell: UITableViewCell,
92 + forRowAt indexPath: IndexPath
93 + ) {
94 + sections[indexPath.section].rows[indexPath.row].willDisplay(cell: cell)
95 }
96 }
84 -
85 - public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
86 - let item = sections[indexPath.section].rows[indexPath.row]
87 - let identifier = item.identifier
88 -
89 - var cell = tableView.dequeueReusableCell(withIdentifier: identifier) as? JomloTableViewCell
90 - if cell == nil {
91 - tableView.register(UINib(nibName: identifier, bundle: nil), forCellReuseIdentifier: identifier)
92 - cell = tableView.dequeueReusableCell(withIdentifier: identifier) as? JomloTableViewCell
97 +
98 + // MARK: - UITableViewDataSource
99 +
100 + extension JomloTableView: UITableViewDataSource {
101 +
102 + public func numberOfSections(in tableView: UITableView) -> Int {
103 + sections.count
104 }
94 -
95 - item.populateView(cell: cell!)
96 -
97 - return cell!
105
106 + public func tableView(
107 + _ tableView: UITableView,
108 + numberOfRowsInSection section: Int
109 + ) -> Int {
110 + guard !sections.isEmpty else { return 0 }
111 + return sections[section].count
112 + }
113 +
114 + public func tableView(
115 + _ tableView: UITableView,
116 + cellForRowAt indexPath: IndexPath
117 + ) -> UITableViewCell {
118 + let item = sections[indexPath.section].rows[indexPath.row]
119 + let identifier = item.identifier
120 +
121 + let cell: JomloTableViewCell
122 + if let reusedCell = tableView.dequeueReusableCell(withIdentifier: identifier)
123 + as? JomloTableViewCell
124 + {
125 + cell = reusedCell
126 + } else {
127 + tableView.register(
128 + UINib(nibName: identifier, bundle: nil),
129 + forCellReuseIdentifier: identifier
130 + )
131 + cell =
132 + tableView.dequeueReusableCell(withIdentifier: identifier) as? JomloTableViewCell
133 + ?? JomloTableViewCell(style: .default, reuseIdentifier: identifier)
134 + }
135 +
136 + item.populateView(cell: cell)
137 + return cell
138 + }
139 }
100 -
101 -}
140 #endif
Sources/JomloTableView/JomloTableViewCell.swift
+7 -8
@@ -1,17 +1,16 @@
1 //
2 // JomloTableViewCell.swift
3 -// Pods
3 +// JomloTableView
4 //
5 // Created by Seto Elkahfi on 3/27/17.
6 //
7 -//
7
9 -import Foundation
8 #if canImport(UIKit)
11 -import UIKit
9 + import UIKit
10
13 -@available(iOS 11.0, tvOS 11.0, *)
14 -open class JomloTableViewCell: UITableViewCell {
15 -
16 -}
11 + /// Base class for cells used with `JomloTableView`.
12 + ///
13 + /// Subclass this to create custom cells, then reference the subclass
14 + /// via `JomloTableViewRow.identifier`.
15 + open class JomloTableViewCell: UITableViewCell {}
16 #endif
Sources/JomloTableView/JomloTableViewRow.swift
+50 -54
@@ -1,66 +1,62 @@
1 //
2 // JomloTableViewRow.swift
3 -// Pods
3 +// JomloTableView
4 //
5 // Created by Seto Elkahfi on 3/27/17.
6 //
7 -//
7
9 -import Foundation
8 #if canImport(UIKit)
11 -import UIKit
9 + import UIKit
10
13 -/**
14 - A singe row to be inserted in an instance of JomloTableViewSection. Subclass from this class and reference the identifier
15 - that used by its corresponding cell view. The cell is a subclass from JomloTableViewCell.
16 - */
11 + /// A single row to be inserted in a `JomloTableViewSection`.
12 + ///
13 + /// Subclass this and reference the identifier that corresponds to your cell's
14 + /// reuse identifier. The cell should be a subclass of `JomloTableViewCell`.
15 + @MainActor
16 + open class JomloTableViewRow: NSObject {
17
18 -@available(iOS 11.0, tvOS 11.0, *)
19 -open class JomloTableViewRow: NSObject {
20 -
21 - // Callback for on row clicked.
22 - // Use IBAction on single view component if you need to
23 - // register action for a particular view inside the row.
24 - internal var callback: ((JomloTableViewRow) -> (Void))?
25 -
26 - // An identifier of JomloTableViewCell.
27 - open var identifier: String {
28 - return ""
29 - }
30 -
31 - // Actual height of this row
32 - // Use UITableViewAutomaticDimension to set the height dynamically
33 - open var rowHeight: CGFloat {
34 - return 0
35 - }
36 -
37 - // Height estimation for this row
38 - open var estimatedRowHeight: CGFloat {
39 - return 0
40 - }
41 -
42 - open func setOnRowClicked(_ callback: @escaping (JomloTableViewRow) -> Void) {
43 - self.callback = callback
44 - }
45 -
46 - // The subclass must override this method.
47 - // Otherwise, we throw error.
48 - open func populateView(cell: JomloTableViewCell) {
49 - fatalError("Must be overrided")
50 - }
51 -
52 - open func willDisplay(cell: UITableViewCell) {
53 - #if (ios)
54 - cell.separatorInset = UIEdgeInsets(top: 0, left: 6, bottom: 0, right: 6)
55 - #endif
56 - }
57 -
58 - // Call the callback
59 - open func onRowClicked() {
60 - if let callback = callback {
61 - callback(self)
18 + /// Callback invoked when the row is tapped.
19 + /// Use IBAction on individual view components if you need to
20 + /// register actions for a particular view inside the row.
21 + internal var callback: (@MainActor (JomloTableViewRow) -> Void)?
22 +
23 + /// The reuse identifier for the corresponding `JomloTableViewCell`.
24 + open var identifier: String { "" }
25 +
26 + /// The actual height of this row.
27 + /// Use `UITableView.automaticDimension` to set the height dynamically.
28 + open var rowHeight: CGFloat { 0 }
29 +
30 + /// The estimated height for this row, used for performance optimization.
31 + open var estimatedRowHeight: CGFloat { 0 }
32 +
33 + /// Sets the callback to be invoked when the row is selected.
34 + ///
35 + /// - Parameter callback: A closure receiving the selected row.
36 + open func setOnRowClicked(_ callback: @escaping @MainActor (JomloTableViewRow) -> Void) {
37 + self.callback = callback
38 + }
39 +
40 + /// Configures the cell with this row's data.
41 + ///
42 + /// Subclasses **must** override this method.
43 + /// - Parameter cell: The cell to populate.
44 + open func populateView(cell: JomloTableViewCell) {
45 + fatalError("Subclasses must override populateView(cell:)")
46 + }
47 +
48 + /// Called when the cell is about to be displayed.
49 + ///
50 + /// - Parameter cell: The cell that will be displayed.
51 + open func willDisplay(cell: UITableViewCell) {
52 + #if os(iOS)
53 + cell.separatorInset = UIEdgeInsets(top: 0, left: 6, bottom: 0, right: 6)
54 + #endif
55 + }
56 +
57 + /// Invokes the row-selection callback.
58 + open func onRowClicked() {
59 + callback?(self)
60 }
61 }
64 -
65 -}
62 #endif
Sources/JomloTableView/JomloTableViewSection.swift
+38 -48
@@ -1,58 +1,48 @@
1 //
2 // JomloTableViewSection.swift
3 -// Pods
3 +// JomloTableView
4 //
5 // Created by Seto Elkahfi on 3/27/17.
6 //
7 -//
7
9 -import Foundation
8 #if canImport(UIKit)
11 -import UIKit
12 -
13 -@available(iOS 11.0, tvOS 11.0, *)
14 -public class JomloTableViewSection {
15 -
16 - /**
17 - Internal array of rows in this section.
18 - **/
19 - internal var rows = Array<JomloTableViewRow>()
20 -
21 - /**
22 - The only initializer required for this class. It needs to explicitly declared as public so can be initialized from outside module.
23 - **/
24 - public init() {
25 -
26 - }
27 -
28 - /**
29 - Computed property to count rows in this section.
30 - **/
31 - public var count: Int {
32 - get {
33 - return rows.count
9 + import UIKit
10 +
11 + /// A section containing an ordered list of `JomloTableViewRow` instances.
12 + ///
13 + /// Add rows to a section, then add the section to a `JomloTableView`.
14 + @MainActor
15 + public final class JomloTableViewSection {
16 +
17 + /// The rows in this section.
18 + internal var rows: [JomloTableViewRow] = []
19 +
20 + /// Creates an empty section.
21 + public init() {}
22 +
23 + /// The number of rows in this section.
24 + public var count: Int { rows.count }
25 +
26 + /// Adds a single row to this section.
27 + ///
28 + /// - Parameter row: The row to append.
29 + public func addRow(row: JomloTableViewRow) {
30 + rows.append(row)
31 + }
32 +
33 + /// Removes all rows from this section.
34 + public func removeAllRows() {
35 + rows.removeAll()
36 + }
37 +
38 + /// Removes the last row from this section.
39 + public func removeLastRow() {
40 + rows.removeLast()
41 + }
42 +
43 + /// Removes the first row from this section.
44 + public func removeFirstRow() {
45 + rows.removeFirst()
46 }
47 }
36 -
37 - // Add a single row for this table view section
38 - public func addRow(row: JomloTableViewRow) {
39 - self.rows.append(row);
40 - }
41 -
42 - // Remove all rows in this table view section
43 - public func removeAllRows() {
44 - self.rows.removeAll()
45 - }
46 -
47 - // Remove last row in this table view section
48 - public func removeLastRow() {
49 - self.rows.removeLast()
50 - }
51 -
52 - // Remove first row in this table view section
53 - public func removeFirstRow() {
54 - self.rows.removeFirst()
55 - }
56 -
57 -}
48 #endif
mise.toml new
+2
@@ -0,0 +1,2 @@
1 +[tools]
2 +ruby = "latest"